C++ 在变量宏中展开变量模板(如何从目标函数中提取参数名称)

C++ 在变量宏中展开变量模板(如何从目标函数中提取参数名称),c++,variadic-templates,template-meta-programming,variadic-macros,preprocessor-meta-program,C++,Variadic Templates,Template Meta Programming,Variadic Macros,Preprocessor Meta Program,我正在努力解决一个具有挑战性但又很简单的问题。 假设我有一个目标函数,如下所示 void target_fnc(int arg1, double arg2) { /* do something here */ } template <typename ...A> void extract(void (*)(A...)) { printer(A...); } 我想“提取”的是变量名(即“arg1”、“arg2”)。 例如,通过一些预处理获取变量的这些信息是很简单的 #define

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

void target_fnc(int arg1, double arg2)
{ /* do something here */ }
template <typename ...A>
void extract(void (*)(A...))
{ printer(A...); }
我想“提取”的是变量名(即“arg1”、“arg2”)。 例如,通过一些预处理获取变量的这些信息是很简单的

#define PRINTER(name) printer(#name)

void printer(const std::string& name) {cout << name << endl;}
但是我没有任何关于如何从目标函数中“提取”的线索。例如,使用可变模板技术如下

void target_fnc(int arg1, double arg2)
{ /* do something here */ }
template <typename ...A>
void extract(void (*)(A...))
{ printer(A...); }
模板
无效摘录(无效(*)(A…)
{打印机(A…;}
它不起作用:我将获得“A…”,当然不是未打包的变量。。。 有什么建议吗

谢谢!
注意:我使用的是C++11,GCC4.8.1

CPP只是一个复制粘贴文本系统。做那种魔术是不明智的。事实上,它只做了愚蠢的“当你看到X,放Y”的操作

在您的情况下,如果您尝试迭代可变数据包:

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...);
}

inline void print(const std::string&name){std::coutCPP只是一个复制粘贴文本系统。它的设计目的并不是为了实现那种魔力。事实上,它只执行愚蠢的“当你看到X时,放Y”操作

在您的情况下,如果您尝试迭代可变数据包:

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...);
}

inline void print(const std::string&name){std::cout编译步骤的执行顺序是有顺序的,您想要的不是我们现有的顺序

<强>预处理器首先执行>;然后完成时,C++构建开始。模板化的事物正在构建时间,不赋予它们神奇的能力来供给预处理器,反之亦然。

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

有大量的建议需要反思:


在C++中,但我不知道它什么时候会变成一件东西。 否则,您可以尝试类似


编译步骤的执行有一个顺序,而您想要的不是我们现有的顺序

<强>预处理器首先执行>;然后完成时,C++构建开始。模板化的事物正在构建时间,不赋予它们神奇的能力来供给预处理器,反之亦然。

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

有大量的建议需要反思:


在C++中,但我不知道它什么时候会变成一件东西。 否则,您可以尝试类似


为什么您需要这样的东西?只有一条注释:C++11可变模板的最重要功能之一是可变模板函数。也就是说,它是一种类型安全的可变函数,替代了不安全、易出错且限制非常有限的可变函数(以及带有它的可变宏)C++继承了C。为什么你要合并这两个?自感知数据类型,即使用变量名(从用户代码)以后可以看到,而不是使用数字序列…应用实例,命名元组,例如(见get)。我不希望用户必须为已经存在的东西提供结构/附加代码。请澄清我,我不明白你想做什么。你的目标是在某个函数调用中存储用作参数的变量的名称?是的。但不仅仅是存储,还要建立一个成员名称与在函数调用中使用的名称相同的结构某个函数调用的参数,这样mystruct.name_var(或类似的)将可用。另外,基于字符串的解决方案也可以很好(不知何故),但我仍然必须解析函数签名才能得到这些名称…为什么需要这样的东西?只有一条注释:C++11可变模板的最重要功能之一是可变模板函数。也就是说,可变模板函数是一种类型安全的函数,它替代了不安全、容易出错且非常有限的可变函数C++中继承了C++(以及它的变量宏)。为什么要尝试合并这两个?自感知数据类型,即使用变量名(从用户代码)稍后可见,而不是使用数字序列…应用实例,命名元组,例如(见get)。。我不希望用户必须为已经存在的东西提供结构/附加代码。请澄清我,我不明白你想做什么。你的目标是在某个函数调用中存储用作参数的变量的名称?是的。但不仅仅是存储,还要建立一个成员名称与在函数调用中使用的名称相同的结构某个函数调用的参数,这样mystruct.name_var(或类似的)将可用。另外,基于字符串的解决方案也可以很好(不知何故),但我仍然必须解析函数签名才能得到这些名称…无论如何,我同意你的答案,我以错误的方式解决了这个问题-但我想知道是否有可能从预编译器中获得更多。顺便说一下,我已经注意到,我只得到了代码中定义的最后一个变量名…非常耐心,你可以做almosC预处理器中没有任何东西。例如,检查Boost.preprocessor。无论如何,我同意你的答案,我以错误的方式解决了这个问题-但我想知道是否可能从预编译器中获得更多。顺便说一下,我已经注意到,我只得到了代码中定义的最后一个变量名…非常耐心,你几乎可以做任何事情C预处理器中的东西。例如,检查Boost.preprocessor。