c++ - 如果作为参数传递的仿函数不带参数,则启用模板

标签 c++ templates overloading variadic-templates sfinae

我正在尝试为模板函数定义两个重载。 如果作为参数传递的仿函数没有参数,则生成第一个重载,否则生成第二个重载。 我开始这样实现:

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.

我怎样才能做到这一点?

最佳答案

您可以将检测习惯用法与 std::void_tstd::declval 结合使用来检测此类功能。

template <typename FuncT>
using invocable_without_args_t = std::void_t<decltype(std::declval<FuncT>()())>;

更多信息是available here ;这篇文章帮助我理解了它是如何工作的。

关于c++ - 如果作为参数传递的仿函数不带参数,则启用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57497828/

相关文章:

c++ - 从C中的字符串中剪切字符

perl - 我可以重载 Perl 的 = 吗? (还有使用 Tie 时的问题)

jquery - 禅宗编码 + jQuery

java - javascript 和 jquery 中的方法和函数重载

c++ - 重载虚函数集的部分继承

c++ - 如何让整个场景围绕自己旋转? (我的代码有一个小错误,就是让对象绕着自己旋转)

c++ - 无法加载库 *.dll 未知错误 0x000000c1

c++ - 对象手势识别。 OpenCV C++

c++ - 在成员变量中使用模板类作为模板模板参数时出错

c++ - 如何将 const 应用于 C++ 中参数列表之外的模板参数类型?