我想要一个通用的方法来处理函数并最终调用它们所以我编写下面的代码问题是代码正在编译但是当我测试它时我得到了类的错误
错误的模板参数数量(1,应为0)auto al = action :: apply <5> :: value;
所以我知道我做错了什么,但我找不到它是什么.
templatestruct action{ template struct apply{ }; }; template struct action ::value >::type ,P...>{ template struct apply{ static const decltype( std::result_of ::type ) value = FN( std::forward (args)...); }; }; int test(int x) { return x; } int main() { auto al= action
::apply<5>::value; std::cout << "result :" << al <
Yakk - Adam .. 8
这是您的主要模板:
templatestruct action 无论何时
action
,都通过此主模板解释参数.action所以在这里,你传递
decltype(test)
asT
和int
asenabled
.没什么...P
.然后,我们测试是否适用任何模板专业化.
templatestruct action ::value >::type ,P...> 这需要分解.该部分后
action
是对我们的模式匹配.之前的部分只是我们从中推导出的一些变量.所以
actionstruct action ::value >::type ,P...> 排队:
actionstruct action ::value >::type ,P...> 以下是它们的对应方式:
FN=decltype(test) typename std::enable_if< std::is_function::value >::type=int P...= 好吧,所以争论1是
decltype(test)
,又名int(int)
.我们推断这是FN
.都好.接下来,有两个参数.所以
...P
显然是空的.参数2处于非推导的上下文中.我们计算出来了:
typename std::enable_if< std::is_function::value >::type typename std::enable_if< std::is_function ::value >::type typename std::enable_if< true >::type void ......好吧,这个专业化说它是
void
.但我们过去了int
.由于void=int
无意义,此专业化不适用.我们在这里没有模式匹配.因此我们回到主要专业化:
templatestruct action{ template struct apply{ }; }; 好吧,所以它有一个成员模板
apply
,只需要0个非类型参数,因为它...P
是空的.因此你的错误.
专业化不是重载.它们是主模板的模式匹配实现替换.主模板参数始终是签名.专业化可以重命名和模式匹配某些选择.
您可能想要使用别名.重命名
action
为action_helper
.可选择将其放在details
命名空间中.然后:templateusing action = action_helper ; 并
action
在客户端代码中使用.
1> Yakk - Adam ..:这是您的主要模板:
templatestruct action 无论何时
action
,都通过此主模板解释参数.action所以在这里,你传递
decltype(test)
asT
和int
asenabled
.没什么...P
.然后,我们测试是否适用任何模板专业化.
templatestruct action ::value >::type ,P...> 这需要分解.该部分后
action
是对我们的模式匹配.之前的部分只是我们从中推导出的一些变量.所以
actionstruct action ::value >::type ,P...> 排队:
actionstruct action ::value >::type ,P...> 以下是它们的对应方式:
FN=decltype(test) typename std::enable_if< std::is_function::value >::type=int P...= 好吧,所以争论1是
decltype(test)
,又名int(int)
.我们推断这是FN
.都好.接下来,有两个参数.所以
...P
显然是空的.参数2处于非推导的上下文中.我们计算出来了:
typename std::enable_if< std::is_function::value >::type typename std::enable_if< std::is_function ::value >::type typename std::enable_if< true >::type void ......好吧,这个专业化说它是
void
.但我们过去了int
.由于void=int
无意义,此专业化不适用.我们在这里没有模式匹配.因此我们回到主要专业化:
templatestruct action{ template struct apply{ }; }; 好吧,所以它有一个成员模板
apply
,只需要0个非类型参数,因为它...P
是空的.因此你的错误.
专业化不是重载.它们是主模板的模式匹配实现替换.主模板参数始终是签名.专业化可以重命名和模式匹配某些选择.
您可能想要使用别名.重命名
action
为action_helper
.可选择将其放在details
命名空间中.然后:templateusing action = action_helper ; 并
action
在客户端代码中使用.