私は特にラムダに興味のあるc++11を研究しています。
いくつかの練習の後、ラムダクロージャは無名関数オブジェクトであると思いました。
だから私はこのコードを書きました。
template <class callable_object>
void lambda_caller( callable_object lambda )
{
std::cout<< sizeof(lambda) << endl;
lambda();
}
テンプレートを使用する代わりに使用できることは知っていstd::function
ますが、型キャスト中のオーバーヘッドは必要ありません。
しかし、この質問を読んで問題が1つ見つかりました。C++ 11でラムダのベクトルを作成できないのはなぜですか?
回答者は、「同じ署名を持っていても、すべてのラムダは異なるタイプを持っています。」と述べました。
コンパイラは、クラスごとに異なるコードを作成します。
lambda_caller
したがって、ラムダの別の定義を渡すたびに、コンパイラは別のバージョンのを作成すると思います。
使用する以外に、それを回避する方法はありますstd::function
か?ラムダクロージャのジェネリック型はありませんか?