我试图检查传递的函数参数是否是一元的,如此
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
中没有任何类型的东西(如果检查则是启用)
答案 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 {};