[英]Extracting C Function's Parameters Using C++ Metaprogramming (Example from “Practical C++ Metaprogramming”)
The following is an example from "Practical C++ Metaprogramming" (pages 16/17): 以下是“实用C ++元编程”(第16/17页)中的示例:
#include <tuple>
#include <typeinfo>
template <typename F>
struct make_tuple_of_params;
template <typename Ret, typename... Args>
struct make_tuple_of_params<Ret (Args...)>
{
using type = std::tuple<Args...>;
};
template <typename F>
using make_tuple_of_params_t = typename make_tuple_of_params<F>::type;
template<typename F>
void some_magic_function(F f)
{
// if F is in the form void(double*, double*)
// make_tuple_of_params is std::tuple<double*, double*>
make_tuple_of_params_t<F> params;
// ...
}
void Foo(double* x, double* y) { }
int main()
{
some_magic_function(Foo);
}
It's failing to compile: 它无法编译:
$ clang++ -std=c++14 MakeTuple.cpp
MakeTuple.cpp:14:5: error: implicit instantiation of undefined template 'make_tuple_of_params<void (*)(double *, double*)>'
Is this because the non specialized version of make_tuple_of_params (lines 4 and 5 of the code above) is not defined? 这是因为未定义make_tuple_of_params的非专用版本(上述代码的第4行和第5行)吗?
You actually need to different overloading, depending if you extracting it from a pointer or from a signature template argument, see below. 实际上,您需要进行不同的重载,具体取决于您是从指针还是从签名模板参数中提取它,请参见下文。
template <typename F>
struct make_tuple_of_params;
template <typename Ret, typename... Args>
struct make_tuple_of_params<Ret (*)(Args...)> {
using type = std::tuple<Args...>;
};
template <typename Ret, typename... Args>
struct make_tuple_of_params<Ret(Args...)> {
using type = std::tuple<Args...>;
};
template <typename F>
using make_tuple_of_params_t = typename make_tuple_of_params<F>::type;
template <typename F>
bool some_magic_function(F f) {
// if F is in the form void(double*, double*)
// make_tuple_of_params is std::tuple<double*, double*>
return std::is_same<std::tuple<double*, double*>, make_tuple_of_params_t<F>>::value;
}
void Foo(double* x, double* y) {}
int main() {
cerr << some_magic_function(Foo) << endl;
cerr
<< std::is_same<std::tuple<int, int>, make_tuple_of_params_t<void(int, int)>>::value
<< endl;
// The latter one might be handy in some of template metaprogramming constructs
return 0;
}
Sorry, have not look at the book pages, so do not know what the authro meant there. 抱歉,没有看过书页,所以不知道授权在这里是什么意思。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.