C++0xラムダについて質問があります。私のコードでは、特定の型がC++0xラムダ式の型であるかどうかを知ることが有益です。例を挙げると:
struct foobar
{
void operator()()
{
}
};
auto lambda = []{};
typedef is_lambda < decltype(lambda) > ::type T; // T would be a true_type
typedef is_lambda < foobar > ::type T; // T would be a false_type
ラムダ式を関数およびメンバー関数タイプと区別するのはかなり簡単です。ファンクターは別の問題です。
ここで私が目にする問題は、次のC++0x標準に従ったラムダ式の定義です。定義する必要があるのは、パブリックコール演算子だけです。ただし、これはファンクターにも当てはまります。呼び出し演算子の存在をテストするだけでは、ラムダ式とファンクターを区別するのに十分ではありません。さらに、ファンクターのオペレーターが存在しない場合、SFINAEが適用されないため、コンパイラー・エラーが発生します。これはいつ起こりますか?ファンクターの呼び出し演算子はテンプレート化できます。したがって、そのようなコード:
typedef decltype(&T::operator()) call_type;
テンプレート化されていない呼び出し演算子を使用してラムダ式とファンクターの両方で機能し、テンプレート化された呼び出し演算子のコンパイラエラーを生成します。
is_lambda < >
トレイトは、組み込みのコンパイラ機能を使用してのみ作成できると思います。この特性を実装する方法がわかりますか?