检查功能模板是否一元

时间:2017-04-01 21:43:40

标签: 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中没有任何类型的东西(如果检查则是启用)

1 个答案:

答案 0 :(得分:0)

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