【发布时间】:2019-08-14 15:33:22
【问题描述】:
我正在尝试为模板函数定义两个重载。 如果作为参数传递的函子没有参数,则生成第一个重载,否则生成第二个重载。 我开始这样实现:
template <typename R, typename... Types>
constexpr size_t argumentCount(R (*f)(Types...))
{
return sizeof...(Types);
}
template <typename Function>
typename std::enable_if<argumentCount<Function>() == 0, int>::value = 0 > callFunc(Function fu)
{
fu();
}
template <typename Function, typename... Params>
typename std::enable_if<argumentCount<Function>() == 0, int>::value = 0 > callFunc(Function fu, Params... params)
{
fu(std::forward<decltype(params)>(params)...);
}
这不编译有几个原因,包括解析错误。我想做的是,
callFunc([](){}); 将调用重载 1,而callFunc([](int value1,int value2){}); 将调用重载 2。
我怎样才能做到这一点?
【问题讨论】:
-
FWIW 您的最后一个函数将适用于这两种情况。拥有
template <typename Function, typename... Params> void callFunc(Function fu, Params... params) { fu(std::forward<decltype(params)>(params)...); }可以让你做到callFunc([](){});和callFunc([](int value1,int value2){}, 1, 2);
标签: c++ templates overloading variadic-templates sfinae