SFINAE用于具有默认参数的函数对象

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)

Vit*_*meo 5

我不相信没有某种功能静态反射就可以检测到这种情况.但是,您可以检查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)

wandbox.org上的实例