0xB*_*F00 8 c++ template-meta-programming variadic-templates c++14
我刚读过"Practical C++ Metaprogramming"这本书,它有以下我无法编译的例子.你能帮忙解决这个问题.
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 callable)
{
make_tuple_of_params_t<F> tuple;
/*
... do something with arguments in tuple...
*/
}
int main()
{
some_magic_function([] (int, double, float) {});
}
Run Code Online (Sandbox Code Playgroud)
我收到一个编译错误说:'type'不是'make_tuple_of_params'的任何直接或间接基类的成员.由于选择了默认结构,因此SFINAE无法按预期工作.我该如何解决?
类型[] (int, double, float) {}是本地的未命名类类型main,称为闭包类型.绝对不是 void (int, double, float) ; 事实上它根本不是一种功能类型.因此,函数类型的特化不适用,并且选择了主模板.(请注意,您的代码中不涉及SFINAE).
至于如何解决这个问题:我认为没有一个完全通用的解决方案.可能存在特定的解决方案/解决方法some_magic_function,但这取决于您需要该功能执行的操作.
对于lambdas,如果不包括带有自动参数的lambda,则解决方法可能如下所示:
#include <tuple>
#include <typeinfo>
#include <iostream>
template <class>
struct make_tuple_of_params;
template <class Res, class Type, class... Args>
struct make_tuple_of_params<Res (Type::*)(Args...) const> {
using type = std::tuple<Args...>;
};
template <class F>
using make_tuple_of_params_t = typename make_tuple_of_params<F>::type;
template<typename F>
void some_magic_function(F callable)
{
make_tuple_of_params_t<decltype(&F::operator())> tuple;
std::cout << typeid(tuple).name() << std::endl;
}
int main()
{
some_magic_function([] (int, double, float) {});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1262 次 |
| 最近记录: |