型がファンクターかどうかを判断するための特性メタ関数を作成できますか? の 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;
};
operator()
ただし、ジェネリック ラムダはテンプレート関数であるため、これはジェネリック ラムダでは機能しません。
ジェネリック ラムダの引数の型にいくつかの制約を加える、ジェネリック ラムダ バージョンの限定的なケースのコードがいくつかあります。たとえば、ラムダ式にメンバー アクセス操作などの型に対して有効ではない式が含まれている場合、ここでの回答 ( https://stackoverflow.com/a/5117641/2580815 ) は機能しません。int
アリティに一般性は必要ありません。実際、型が 1 つのパラメーターのみを受け入れるファンクターになる可能性があることを知る必要があるだけです。
どうすれば実装でき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; }; }