c++ - 检查函数模板是否是一元的

标签 c++ c++11 templates c++14 sfinae

我正在尝试检查传递的函数参数是否是一元的,类似这样

template <typename Func>
using EnableIfUnary = std::enable_if_t<std::is_same<
    decltype(std::declval<Func>()(std::declval<const int&>())),
    decltype(std::declval<Func>()(std::declval<const int&>()))>::value>;

template <typename Func, EnableIfUnary<Func>* = nullptr>
void do_something(Func func) { ... }

// and use like so
template <typename Type>
void foo(Type) { cout << "foo(Type)" << endl; }
template <typename Type>
void bar(Type) { typename Type::something{}; }

int main() {
    do_something(foo);
    return 0;
}

是否有更好的方法来检查函数是否是一元函数?当传入的函数(在我的示例中为 foo())以不适用于 int 的方式使用类型时,我当前的方法不起作用。

在上面的例子中,foo 是合法的而 bar 不是,因为在 int 中没有命名的类型(这是 enable if 检查的内容)

最佳答案

template<typename...>
struct is_unary_function : std::false_type {};

template<typename T, typename R>
struct is_unary_function<R(*)(T)> : std::true_type {};

Live Demo

关于c++ - 检查函数模板是否是一元的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162335/

相关文章:

c++ - 如何使用 DetourAttachEx 创建蹦床函数? (有MS绕路)

c++ - 为什么函数默认参数不能在C++中完美转发?

c++ - 如果 std::addressof 是 & 的可读版本。 *& 的可读版本是什么?

c++ - 类与函数模板特化

python - Django的模板系统什么时候用escape和safe?

c++ - 使用 sfinae 启用/禁用 typedef 是不可能的。解决方法?

c++ - boost 图metric_tsp_approx解决方案不遵循图的边缘

c++ - 为什么我无法使用此代码下载文件

c++ - 条件下移位操作的使用说明

c++ - 什么时候引用是右值引用?