C ++ lambda表达式带有" dynamic"身体

时间:2015-04-17 07:27:22

标签: c++ lambda

是否可以从外部设置lambda body?

示例:

经典lambda:

[](double x, double y) -> double { return x + y; };

我想做的是这样的事情(为了捕捉想法,这不是工作代码):

const char * const EXPRESSION_FROM_VARIABLE = "x + y";

[](double x, double y) -> double { return EXPRESSION_FROM_VARIABLE; };

基本上我想将字符串更改为"表达式"在编译时。

2 个答案:

答案 0 :(得分:6)

这在纯便携式C ++ 11中是不可能的。我想EXPRESSION_FROM_VARIABLE仅在运行时中已知(与您的伪代码不同)。如果它在编译时<静态知道,则使用一些宏技巧,生成(在构建时)一些中间C ++文件和#include它等等......

但是,您可能希望嵌入一些解​​释器(例如GNU GuileLUA),或使用JIT compilation techniques(以及LLVMlibjit等库, libgccjitGNU lightningasmjit,....)甚至(就像我在MELT中所做的那样)生成C ++代码并分叉其编译-at运行时 - 插件和dlopen(3)插件等。

您需要了解有关编程语言,编译器和解释器的更多信息。另请参阅程序员上的this answer

另请注意,您可以从lambda中分配一些std::function

答案 1 :(得分:0)

您应该使用[]作用域将此变量捕获到lambda,即使不使用const变量也可以使用

    const char * const EXPRESSION_FROM_VARIABLE = "x + y";

    [EXPRESSION_FROM_VARIABLE](double x, double y) -> double { return
    EXPRESSION_FROM_VARIABLE; };

或者您可以使用&amp;:

捕获lambda表达式中可用的所有变量
    [&](double x, double y) -> double { return EXPRESSION_FROM_VARIABLE; };

您还可以使用其他类型的捕获,例如

    [a,&b] // a will be captured by value, b will be captured by reference
    [this] // class pointer will be captured
    [&]    // all available symbols will be captured by reference
    [=]    // all available symbols will be captured by value
    []     // nothing will be captured