8

ラムダのキャプチャされた変数の型/値を取得する方法があるかどうか疑問に思っていましたか? - 使用シナリオは似ています。

int a = 5;
auto lamb = [a](){ return a; };
static_assert(std::is_same<typename get_capture_type<0>(lamb)::type, int>::value, "");
assert(get_capture_value<0>(lamb) == 5)

注:get_capture_*<N>(lambda)の場合、明らかにコンパイラ エラーが発生するはずN > #captured_variablesです。

私が必要としているのは、実際には、可能であれば何らかの方法でキャプチャにアクセスする方法です。つまり、テンプレートのメタプログラミングを自分で行うことができます。

4

3 に答える 3

16

設計上ありえない

5.1.2 [expr.prim.lambda]
15 [...] コピーによってキャプチャされたエンティティごとに、名前のない非静的データ メンバーがクロージャー型で宣言されます。これらのメンバーの宣言順序は規定されていません。[...]
16 [...] 追加の名前のない非静的データ メンバーが、参照によってキャプチャされたエンティティのクロージャ型で宣言されているかどうかは未指定です。

キャプチャされた変数には名前が付けられておらず (または、少なくとも定命の者には言えない名前が付けられています)、それらの宣言順序は意図的に指定されていません。参照によるキャプチャは、クロージャー型には存在しない場合さえあります。

とにかくこれをしたくありません。あなたはそう思うかもしれませんが、実際にはそうではありません。

于 2013-11-14T11:38:53.137 に答える
5

いいえ。C++ にはリフレクションがありません。つまり、ラムダにもリフレクションがないということです。

于 2013-11-14T01:08:05.563 に答える