ラムダ関数をテンプレート化できますか? 質問する

ラムダ関数をテンプレート化できますか? 質問する

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 から概念が削除されたため、多態的ラムダは再び単純な提案になりました。しかし、それに関する提案は見つかりません。:(

おすすめ記事