ラムダは、種類のカテゴリ、ないタイプです。
我々はこれを行うことができます:
struct null_callable_t{
template<class...Ts>
constexpr void operator()(Ts&&...)const{}
explicit constexpr operator bool()const{return false;}
constexpr null_callable_t() {}
friend constexpr bool operator==(::std::nullptr_t, null_callable_t){ return true; }
friend constexpr bool operator==(null_callable_t, ::std::nullptr_t){ return true; }
friend constexpr bool operator!=(::std::nullptr_t, null_callable_t){ return false; }
friend constexpr bool operator!=(null_callable_t, ::std::nullptr_t){ return false; }
};
constexpr null_callable_t null_callable{};
を今我々のコードは次のようになります。
template <typename Lambda>
int foo(Lambda bar) {
if(!bar)
return -1;
else
return bar(3);
}
かなり滑らかなである:
std::cout << foo([](int a) {return a + 3;}) << std::endl;
std::cout << foo(null_callable) << std::endl;
あなたは "ヌルラムダ" とはどういう意味ですか? – melpomene
'std :: optional'や同等のライブラリを他のライブラリから使えますか? – KABoissonneault