2

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

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

4

2 回答 2

1

执行编译步骤是有顺序的,而您想要的不是我们拥有的。

先执行预处理器;然后完成后,C++ 构建开始。模板化的东西是构建时的,并没有赋予它们神奇的能力来为预处理器提供数据,反之亦然。

是的,能够反映符号名称并将它们字符串化等等会很好,但它必须从预处理器接口或使用生成器的预构建步骤完成。

有大量的反思建议: 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;
}
于 2019-03-18T06:36:32.500 回答
0

CPP is only a copy-paste text system. Its not dessigned to do that kind of magic. In fact, it only does stupid "When you see X , put Y" operations.

In your case, if you try to iterate over the variadic pack:

inline void print(const std::string& name) { std::cout << name << std::endl; }

#define PRINT(name) print(#name)

//Base case:
void extract() {}

//Recursive case:
template<typename HEAD , typename... TAIL>
void extract(const HEAD& head , const TAIL& tail...)
{
    PRINT(head);

    extract(tail...);
}

You only get:

head
head
head
head
...

The answer is: Avoid the use of the CPP for stupid things, only use it for #ifdef #endif header guards and portable compilation.

Note that GET_GREATHER(x,y) ((x) > (y) ? (x) : (y)) like macros are not included. C++ has since the beggining of its history a powerfull tool to avoid macros: inline functions

于 2013-07-14T21:13:32.993 回答