Pao*_*tto 2 c++ lambda sfinae template-meta-programming
如果lambda(或函数对象)有默认参数,在编译时告诉最简单的方法是什么?例:
auto f = [](int i=0){};
auto g = [](int i){};
static_assert(has_default_arg<decltype(f)>::value==true);
static_assert(has_default_arg<decltype(g)>::value==false);
Run Code Online (Sandbox Code Playgroud)
我不相信没有某种功能静态反射就可以检测到这种情况.但是,您可以检查lambda是否可以使用零参数和一个参数进行调用.使用检测习语的示例:
template <class T>
using invocable_zero = decltype(std::declval<T&>()());
template <class T, class X>
using invocable_one = decltype(std::declval<T&>()(std::declval<X>()));
template <class T, class X>
struct has_default_arg : std::conjunction<
std::experimental::is_detected<invocable_zero, T>,
std::experimental::is_detected<invocable_one, T, X>
> { };
Run Code Online (Sandbox Code Playgroud)