2013-06-04 43 views
0

我将字符串映射中的一些数据解析为不同的结构,每个结构都有自己的一组成员变量。该设置可以是这样的:我可以将一组符号传递给宏吗?

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(地图,DEST,{param0Name,param1Name,param2Name})

+0

你可能想看看Boost.PP为这个:http://www.boost.org/doc/libs/1_53_0/libs/preprocessor/doc/index.html – slaphappy

回答

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

没有明显工作。向预处理器添加内容的建议很常见,但通常会被拒绝。

+0

你是对的,没有机制来访问没有可变参数函数的每个元素。 – Pedrom

+0

就像在这种情况下对我有用一样有用,这是公平的,因为它会引入许多使用情况,使事情变得更加难以理解,所以不愿意向预处理器添加内容。 –

相关问题