从lambda获取捕获的变量?

时间:2013-11-13 19:51:32

标签: c++ c++11 lambda c++14

我想知道,如果有办法获取lambda的捕获变量的类型/值? - 使用场景将是相似的;

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显然会导致编译错误。

我需要的只是一种以某种方式访问​​捕获的方法,如果可能的话。也就是说,我可以自己做模板元编程。

2 个答案:

答案 0 :(得分:16)

设计

是不可能的
  

5.1.2 [expr.prim.lambda]
  15 [...]对于由副本捕获的每个实体,在闭包类型中声明一个未命名的非静态数据成员。这些成员的声明顺序未指定。 [...]
  16 [...]未指明是否在闭包类型中为通过引用捕获的实体声明了其他未命名的非静态数据成员。

捕获的变量是未命名的(或者至少具有凡人无法形容的名称),并且故意未指定其声明顺序。在闭包类型中,按引用捕获甚至可能不存在

无论如何你不想这样做。你可能认为你这样做,但事实并非如此。

答案 1 :(得分:5)

没有。 C ++没有反射,这意味着它没有对lambda的反射。