作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试为模板函数定义两个重载。如果作为参数传递的仿函数没有参数,则生成第一个重载,否则生成第二个重载。我开始这样实现:
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_t
和 std::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/
我是一名优秀的程序员,十分优秀!