2016-11-22 7 views
4

関数のベクトルを宣言する方法を見てきました(calling a function from a vector参照)。関数のベクトルを宣言する方法(lambda)

しかし、それはユーザーのポインタに答えます。最新のC++で新しい構文を使用して関数/ lambdaのベクトルを作成するにはどうすればよいですか?新しい構文を使用した機能の

例は、一般的にautoを使用する:

auto f = [] (std::string msg) -> void { 
    std::cout << msg << std::endl; 
}; 

Fの実際の型は何ですか?私はこのタイプのベクトルを宣言できますか?それはstd::function<void(std::string)>だろう、あなたの場合は

std::vector<std::function<void(void)>> vec; 
vec.push_back([]()->void{}); 

は、対応するタイプで任意のヘルプ

+2

"* Fの実際の型は何ですか*?" Unnameable std::tuple - オブジェクト自身。 "*このタイプのベクトルを宣言することはできますか?*"はい、ラムダはデフォルトで構成可能ではないので、役に立たないでしょう。 'std :: vector >'はおそらくあなたの目的に合っています。 – ildjarn

+2

ラムダにクロージャがない場合はポインタを実際に使用することができます.btw – vu1p3n0x

+1

ベクトルが必要ない場合(つまり実際のラムダがコンパイル時にわかっている場合)、lddasのstd :: tupleを作成できます。 – dats

答えて

10

使用std::functionいただき、誠にありがとうございます。

ラムダの正確なタイプは、標準([expr.prim.lambda]/3)ごとの意味が:

(また、クロージャオブジェクトの一種である)ラムダ式の型ユニークな、無名の非組合クラス型

+0

ありがとう。これはまさに私が探していたものです。 – dmg

+4

ラムダにキャプチャがない場合は、関数ポインタを使用することもできます。 – rubenvb

7

fの実際の型は何ですか?私はこのタイプのベクトルを宣言できますか?

タイプfは、autoを使用してのみ推測できます。

std::vector<decltype(f)> v; 

を使用してこのタイプのvectorを宣言することはできますが、それほど有用ではありません。著しく類似しているラムダ関数は異なる型を持っています。さらに悪いことに、同じボディを持つラムダ関数の型も異なります。上記の機能を考えると

auto f = [] (std::string msg) -> void { 
    std::cout << msg << std::endl; 
}; 

auto g = [] (std::string msg) -> void { 
    std::cout << msg << std::endl; 
}; 

auto h = [] (std::string msg) -> void { 
    std::cout << msg << '+' << msg << std::endl; 
}; 

、あなたはあなたの最良のオプションはstd::vectorstd::functionのSを作成することです

std::vector<decltype(f)> v; 
v.push_back(f); // OK 
v.push_back(g); // Not OK 
v.push_back(h); // Not OK 

を使用することはできません。ラムダ関数をそのstd::vectorに追加することができます。 fgの上記の定義を考えると、あなたが使用することができます。

std::vector<std::function<void(std::string)>> v; 
v.push_back(f); 
v.push_back(g); 
v.push_back(h); 
0

を述べたように、あなたが宣言し、それぞれのラムダは、一見同じ署名を持っている場合でも、ユニークなコンテキスト特定のタイプを持っています。これはラムダのベクトルが理論的な価値しか持っていない理由です - あなたは多くても1ラムダでそこに押し込めるでしょう...あなたは2つの選択肢があります - ラムダを他の回答から提案されたアプローチに沿って進め、ラムダをタイプイレーズstd::functionに格納する前にラムダをベクトルに入れるか、ラムダをラムダから離れた各要素のタイプを収集する "コンテナ"

auto t = std::make_tuple([](){ std::cout<<"First lambda" << std::endl; }, 
         [](){ std::cout<<"Second lambda"<< std::endl; }, 
         [](){ std::cout<<"Third lambda" << std::endl; }); 

とコンパイル時に適切なラムダを得る:

std::get<0>(t)(); // the value in get must be known at compile time! 
        // otherwise compiler won't be able to establish type 
        // of lambda and the whole point of using tuple is lost 

[live demo]

関連する問題