主体为 "dynamic" 的 C++ lambda 表达式
C++ lambda expression with "dynamic" body
是否可以从外部设置 lambda 主体?
示例:
经典 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; };
基本上我想在编译时将字符串更改为"expression"。
这在纯可移植的 C++11 中是不可能的。我想 EXPRESSION_FROM_VARIABLE
仅在 runtime 时已知(与您的伪代码不同)。如果它在编译时静态已知,使用一些宏技巧,生成(在构建时)一些中间C++文件和#include
它,等等...
但是,您可能希望嵌入一些解释器(例如 GNU Guile or LUA), or use JIT compilation techniques (and libraries like LLVM, libjit, libgccjit, GNU lightning, asmjit, ....) or even (like I'm doing in MELT) generate C++ code and fork its compilation -at runtime- into a plugin and dlopen(3) 那个插件等。
您需要更多地了解编程语言、编译器和解释器。另请参阅 程序员 上的 this answer。
另请注意,您可以从 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
是否可以从外部设置 lambda 主体?
示例:
经典 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; };
基本上我想在编译时将字符串更改为"expression"。
这在纯可移植的 C++11 中是不可能的。我想 EXPRESSION_FROM_VARIABLE
仅在 runtime 时已知(与您的伪代码不同)。如果它在编译时静态已知,使用一些宏技巧,生成(在构建时)一些中间C++文件和#include
它,等等...
但是,您可能希望嵌入一些解释器(例如 GNU Guile or LUA), or use JIT compilation techniques (and libraries like LLVM, libjit, libgccjit, GNU lightning, asmjit, ....) or even (like I'm doing in MELT) generate C++ code and fork its compilation -at runtime- into a plugin and dlopen(3) 那个插件等。
您需要更多地了解编程语言、编译器和解释器。另请参阅 程序员 上的 this answer。
另请注意,您可以从 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