我正在尝试检测可调用对象是否为二进制(即,它是否operator()采用两个参数).我想对lambdas执行此检查,包括泛型lambdas和约束泛型lambda (例如,使用尾随std::enable_if_t返回类型).
注意:这不是"普通lambda的arity"的副本.我只关心检查泛型lambda是否是二进制的,并且我已经可以为不受约束的泛型lambda或不使用其体中的参数的泛型lambda做到这一点.
我目前的方法是应用Kris Jusiak的Boost.DI C++ Now 2015谈话中描述的技术之一:any_type.它基本上是一个可以隐式转换为任何其他类的类.
struct any_type
{
template <typename T>
constexpr operator T() const noexcept
{
return {};
}
};
Run Code Online (Sandbox Code Playgroud)
在定义之后any_type,我正在使用检测习惯来检查是否可以使用两个参数调用特定的可调用对象:
template<class T>
using is_binary_callable_impl = decltype(std::declval<T>()(any_type{}, any_type{}));
template <typename T>
using is_binary_callable = std::experimental::is_detected<is_binary_callable_impl, T>;
Run Code Online (Sandbox Code Playgroud)
这种方法适用于非泛型和通用lambda ...
auto unary_nongeneric = [](int){};
auto unary_generic = [](auto){};
auto binary_nongeneric …Run Code Online (Sandbox Code Playgroud)