gpt4 book ai didi

c++ - Expand Variadic Template in Vardiadic Macro(如何从目标函数中提取参数名称)

转载 作者:太空宇宙 更新时间:2023-11-04 14:05:02 25 4
gpt4 key购买 nike

我正在努力解决具有挑战性但又简单的问题。假设我有一个目标函数如下

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com