用另一个lambda包装c++ lambda



我试图在c++中获得lambda的内容并从中创建另一个函数。一个理想的最小示例是:

auto A = []{ some_function(args); };
auto B = []{ return /*Contents of A*/; };
// Ideally this would translate to
auto B = []{ return some_function(args); };

宏可以工作,但我想避免使用它们。我已经尝试了一些事情,但我似乎无法找到是否有一种方法来获得lambda的内容(不仅是它可能拥有的返回),并围绕它编写代码。也许没有办法了,但我想确定一下。

我很好奇的一个应用是写一个简单的单元测试:
Test a = []{
check(1 == 1);
check(2 == 1);
};

并且在所有测试函数周围有一个包装器,可以像

[]{
for (line : /*Contents of A*/) {
print("Evaluating {}...", line);
if (not line)
print("Failed test");
}
};

如果A = F1, F2, F3,…,您可以创建B (A) = B (F1)、B (F2)、B (F3)…

在编译c++代码之后,没有标准的方法来获取有关其源代码的信息或以您所寻找的方式修改源代码。大多数c++实现将源代码转换为机器码(即汇编指令),并通过优化器运行它,只要代码的可观察行为仍然相同,优化器就可以重新排序或删除代码。

我能想到的唯一的事情是非常复杂的,它甚至不是一个完整的解决方案:如果你发布你的程序与它自己的源代码和它所依赖的所有头文件的副本,那么你可以链接到libclang并使用它来解析c++源代码并获得关于每个AST节点的详细信息。这会给你的程序增加很多复杂性,所以可能不值得这么做。

最新更新