我需要记录(出于审计/记录目的)在我的代码中传递的 lambda 函数的代码。当然,lambda对象也需要保存。所以我想出了一个宏观的解决方案,如下:
#define LAMBDA_AND_STRING(lambda) lambda, #lambda
using namespace std;
int main(int argc, const char * argv[])
{
auto p = pair<function<void()>, string> ( LAMBDA_AND_STRING( [] {
cout << "Hello world!" << endl;
cout << "Hello again!";
} ) );
cout << "CODE:" << endl << p.second << endl << endl;
cout << "EXECUTION:" << endl;
p.first();
cout << endl;
}
这输出:
CODE:
[] { cout << "Hello world!" << endl; cout << "Hello again!"; }
EXECUTION:
Hello world!
Hello again!
这几乎很好,但是 lambda 定义中的换行符消失了(实际上,我的 lambda 比上面的原型示例长得多,因此出于可读性的原因需要保留换行符)。关于如何保留它们有什么想法吗? (C++11 就可以)。
Thanks!
如果我没记错的话,新行甚至不是传递给宏的参数的一部分。这与空白折叠相对于宏扩展发生的顺序有关,并且实际上空白在预处理器标记化期间被剥离。
foo.cpp:
#define FOO(a) a
FOO(
one
two
three
)
Result:
$ gcc -E foo.cpp
# 1 "foo.cpp"
# 1 "<command-line>"
# 1 "foo.cpp"
one two three
所以我想你运气不好。你可以做点什么really很难解决它:
#define LAMBDA_AND_STRING(lambda) lambda, #lambda
#define NEWLINE
LAMBDA_AND_STRING( [] { NEWLINE
cout << "Hello world!" << endl; NEWLINE
cout << "Hello again!"; NEWLINE
} )
预处理为:
[] { cout << "Hello world!" << endl; cout << "Hello again!"; }, "[] { NEWLINE cout << \"Hello world!\" << endl; NEWLINE cout << \"Hello again!\"; NEWLINE }"
现在更换NEWLINE
打印之前在字符串中添加 s 。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)