我正在努力解决具有挑战性但又简单的问题。 假设我有一个目标函数如下
void target_fnc(int arg1, double arg2)
{ /* do something here */ }
我想“提取”的是变量名称(即“arg1”、“arg2”)。 例如,通过一些预处理为变量获取此信息是微不足道的
#define PRINTER(name) printer(#name)
void printer(const std::string& name) {cout << name << endl;}
我也可以在多个变量的情况下使用可变参数宏
#define PRINTER2(names...) printer(#names)
printer(arg1,arg2)
但我不知道如何从目标函数中“提取”..例如,使用可变参数模板技术如下
template <typename ...A>
void extract(void (*)(A...))
{ printer(A...); }
这是行不通的:我将获得“A...”而不是解压缩的变量,当然... 有什么建议吗?
谢谢! 注意:我使用的是 C++11,gcc 4.8.1
最佳答案
编译步骤的执行是有顺序的,你想要的不是我们有的。
预处理器先执行;完成后,C++ 构建开始。模板化的东西是构建时的,并没有赋予它们神奇的力量来喂养预处理器,这是相反的方式。
是的,如果能够反射(reflect)符号名称并将它们字符串化等等,那就太好了,但这必须从预处理器接口(interface)或使用生成器的预构建步骤完成。
有大量的反射(reflection)建议:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0255r0.pdf
或者
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1240r0.pdf
在 C++ 中,但我不知道它什么时候会成为现实。
否则你可以尝试像
http://pfultz2.com/blog/2012/07/31/reflection-in-under-100-lines/
REFLECTABLE
(
(const char *) name,
(int) age
)
int main()
{
Person p("Tom", 82);
print_fields(p);
return 0;
}
关于c++ - Expand Variadic Template in Vardiadic Macro(如何从目标函数中提取参数名称),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17422060/