1. ホーム
  2. c++

[解決済み】ラムダ関数はテンプレート化できる?

2022-04-01 05:53:42

質問

C++11では、ラムダ関数をテンプレート化する方法はあるのでしょうか?それとも、テンプレート化するには、本質的に特殊すぎるのでしょうか?

代わりに古典的なテンプレート化されたクラス/ファンクタを定義できることは理解していますが、問題はむしろ、この言語がラムダ関数をテンプレート化することを許可しているかどうかということです。

どのように解決するのですか?

2018年にUPDATEしました。C++20 には、テンプレート化され概念化されたラムダが搭載される予定です。この機能は、すでに標準草案に統合されています。


UPDATE 2014: C++14が今年リリースされ、この例と同じ構文でポリモーフィックラムダを提供するようになりました。一部の主要なコンパイラーはすでにこれを実装しています。


現状(C++11)では、悲しいかな、ありません。ポリモーフィックラムダは、柔軟性とパワーの点で優れているでしょう。

元々、モノモフィックで終わっていたのは、コンセプトがあったからです。概念がこのコード状況を難しくしていたのです。

template <Constraint T>
void foo(T x)
{
    auto bar = [](auto x){}; // imaginary syntax
}

制約付きテンプレートでは、他の制約付きテンプレートのみを呼び出すことができます。(そうでなければ、制約をチェックすることができません。) Can foo 呼び出す bar(x) ? ラムダはどのような制約を持つのでしょうか(結局のところ、それに対するパラメータは単なるテンプレートです)。

コンセプトはまだこのようなことに取り組む準備ができていませんでした。 late_check (呼び出すまでコンセプトがチェックされない)といった感じです。それを全部捨てて、単相ラムダにこだわった方がシンプルでした。

しかし、C++0xから概念が削除されたことで、ポリモーフィックラムダは再び単純な命題となった。しかし、そのための提案が見つからない :(