C++11 では、ラムダ関数をテンプレート化する方法はありますか? それとも、テンプレート化するには本質的に特殊すぎるのでしょうか?
代わりに、従来のテンプレート化されたクラス/ファンクタを定義できることは理解していますが、質問は次のようになります。言語ではラムダ関数のテンプレート化が許可されますか?
ベストアンサー1
2018 年更新: C++20 にはテンプレート化され概念化されたラムダが付属します。この機能はすでに標準ドラフトに統合されています。
2014 年更新: 今年 C++14 がリリースされ、この例と同じ構文を持つポリモーフィック ラムダが提供されるようになりました。一部の主要なコンパイラでは、すでにこれを実装しています。
現状(C++11)では、残念ながらそうではありません。柔軟性とパワーの点では、ポリモーフィック ラムダが優れています。
これらがモノモーフィックになった元々の理由は、概念によるものでした。概念によって、このコード状況は困難になりました。
template <Constraint T>
void foo(T x)
{
auto bar = [](auto x){}; // imaginary syntax
}
制約付きテンプレートでは、他の制約付きテンプレートのみを呼び出すことができます。(そうしないと、制約をチェックできません。) を呼び出すことができますかfoo
?bar(x)
ラムダにはどのような制約がありますか (結局のところ、ラムダのパラメーターは単なるテンプレートです)?
コンセプトは、このような問題に取り組む準備ができていませんでした。そのlate_check
ためには、(コンセプトが呼び出されるまでチェックされない) などの追加のものが必要になります。すべてを放棄して、単態的なラムダに固執する方が簡単でした。
しかし、C++0x から概念が削除されたため、多態的ラムダは再び単純な提案になりました。しかし、それに関する提案は見つかりません。:(