C++ 具有"dynamic"体的 lambda 表达式

C++ lambda expression with "dynamic" body

本文关键字:lambda 表达式 体的 dynamic 具有 C++      更新时间:2023-10-16

是否可以从外部设置 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; };

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

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

然而,你可能想要嵌入一些解释器(例如 GNU Guile 或 LUA),或者使用 JIT 编译技术(以及像 LLVM、libjit、libgccjit、GNU Lightning、asmjit 等库),甚至(就像我在 MELT 中所做的那样)生成C++代码并在运行时将其编译分叉到一个插件和 dlopen(3) 该插件中,等等。

您需要更多地了解编程语言,编译器,解释器。另请参阅关于程序员的答案。

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

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

    const char * const EXPRESSION_FROM_VARIABLE = "x + y";
    [EXPRESSION_FROM_VARIABLE](double x, double y) -> double { return
    EXPRESSION_FROM_VARIABLE; };

或者,您可以使用 &: 捕获 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