C++ 具有"dynamic"体的 lambda 表达式
C++ lambda expression with "dynamic" 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; };
基本上我想在编译时将字符串更改为"表达式"。
这
在纯便携式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
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式