我正在尝试检查传递的函数参数是否是一元的,类似这样
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 {};
关于c++ - 检查函数模板是否是一元的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43162335/