【问题标题】:Can I pass an array of symbols to a macro?我可以将一组符号传递给宏吗?
【发布时间】:2013-06-04 16:05:14
【问题描述】:

我正在将字符串映射中的一些数据解析为不同的结构,每个结构都有自己的一组成员变量。设置可能是这样的:

struct AStruct
{
    int a;
    float b;
};


map<string,string> aMap;
aMap["a"] = "3";
aMap["b"] = "2.42";

struct BStruct
{
    string a;
    char b;
};

map<string,string> bMap;
bMap["a"] = "asdf";
bMap["b"] = 'k';

由于结构体很多,但包含的原语很少,我创建了一组有用的模板化解析函数:

template <typename T>
void parse(string origin, T& dest);

现在,为了避免自己必须定义不同的函数来为每个结构分配值,我可以使用宏,如下所示:

#define ASSIGN(map, dest, param0Name, param1Name) \
    dest.param0Name = map[#param0Name]; \
    dest.param1Name = map[#param1Name]; \

并像这样分配:

AStruct myA;
ASSIGN(aMap, myA, a, b);

这是一个很大的帮助。但实际上我的结构都有不同数量的成员,需要在每种情况下定义一个新的宏。

有没有办法可以将一组符号传递给宏并遍历它们?

类似这样的:

ASSIGN(map, dest, { param0Name, param1Name, param2Name })

【问题讨论】:

标签: c++ c macros


【解决方案1】:

我会说你不走运的宏。确实有允许传递参数的可变参数宏,但这是你可以用它们做的所有事情。

我试过了

#define B(x, y) int x = y;
#define A(x, y, ...) B(x, y)  A(__VA_ARGS__)

void f()
{
  A( g, 1, h, 2); 
}

显然不起作用。向预处理器添加东西的建议很常见,但通常会被拒绝。

【讨论】:

  • 你是对的,没有可变参数函数就没有访问每个元素的机制。
  • 尽管在这种情况下对我来说很有用,但人们不愿意向预处理器添加东西是公平的,因为它会引入许多使事情变得更难理解的用例。
猜你喜欢
  • 1970-01-01
  • 2013-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多