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

标签 c++ variadic-templates template-meta-programming variadic-macros preprocessor-meta-program

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

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/

相关文章:

c++ - 通过OpenGL中的纹理传递数组数据

c++ - 如何使用隐式模板类型推导

c++ - 从 Qt URL 打开文件

c# - 如何在任意网格上找到顶点的邻居?

c++ - NaN 到 Bool 转换 : True or False?

c++ - 可以在 C++11 lambda 中隐式捕获参数包吗?

具有可变函数参数的 C++ 多态性

c++ - 是否有可能 static_assert lambda 不是通用的?

c++ - 将概念传递给函数

d - 什么是惯用的(又名 "right")方法将整数集(或至少列表)作为 D 中的模板参数传递?