我正在将字符串映射中的一些数据解析为不同的结构,每个结构都有自己的成员变量集。设置可能是这样的:
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})
答案 0 :(得分:1)
我会说宏,你运气不好。确实有可变的宏允许传递args,但这就是你能用它们做的全部。
我试过
#define B(x, y) int x = y;
#define A(x, y, ...) B(x, y) A(__VA_ARGS__)
void f()
{
A( g, 1, h, 2);
}
显然不起作用。向事先处理器添加内容的提议很常见,但通常会被拒绝。