我可以编写一个特征元函数来确定一个类型是否是函子吗?有大量的代码可以使用 SFINAE 来检查函子decltype(&T::operator())
,例如,
template<class T>
struct is_functor {
template<class F>
static auto test(decltype(&F::operator())) -> std::true_type;
template<class F>
static auto test(...) -> std::false_type;
static constexpr bool value = decltype(test<T>(0))::value;
};
但是,这不适用于泛型 lambda,因为泛型 lambdaoperator()
是一个模板函数。
有一些用于泛型 lambda 版本的有限情况的代码,它们对泛型 lambda 的参数类型进行了一些限制。例如,如果 lambda 表达式包含任何对成员访问操作等类型无效的表达式,则此处的答案 ( https://stackoverflow.com/a/5117641/2580815 ) 将不起作用。int
我不需要任何通用性。事实上,我只需要知道一个类型可以是一个只接受一个参数的函子。
我怎样才能实现我的is_functor
?
用例:
我正在尝试验证给定参数是否是模板函数的函子,也就是说,我想要一些重载的模板函数,例如:
template<class F, class = enable_if_t<is_functor<std::decay_t<F>>::value>>
auto make_func(F &&f) { return std::forward<F>(f); }
template<class F, class = enable_if_t<!is_functor<std::decay_t<F>>::value>>
auto make_func(F &&f) { return [f=std::forward<F>(f)] (auto&&) { return f; }; }