2012-11-07 33 views
1

我想知道一個聰明的方法,以避免在下面的類似結構聲明中重複自己。以下代碼中的所有結構體都從boost :: spirit :: qi :: symbols公開繼承,其中EnumType對於每個結構體都是不同的。C++聲明許多類似的類而不重複自己

struct website_ : qi::symbols<char, Website> 
{ 
    website_() : qi::symbols<char, Website>(website_names, Website_values) { } 
} website_; 

struct currency_name_ : qi::symbols<char, Currency> 
{ 
    currency_name_() : qi::symbols<char, Currency>(currency_names, Currency_values) { } 
} currency_name_; 

其中,例如

enum Website { /*list of websites*/ }; 
const std::vector<Website> Website_values = { /*same list as above*/ }; 
const std::vector<std::string> website_names = { /* list of corresponding names of websites*/ }; 

的目標是每一個初始化結構只給適當的枚舉,枚舉值向量,並與值的名稱字符串的載體。我已經想到了一個新的qi :: symbols子類的解決方案,從中我可以繼承所有的結構,但我認爲這可能是一個矯枉過正的問題,另一個可能使用宏(我不是很熟悉)。有另一種方法使用其他類型的元編程嗎?或者也許是Boost圖書館的一些其他技巧,我已經在使用它了?

回答

2

這就是爲什麼模板被髮明的原因。

template<EnumType t> 
struct symbol_type: qi::symbols<char, t> 
{ 
    symbol_type(const std::vector<std::string>& names, const std::vector<t>& values) 
    : qi::symbols<char, t>(names, values) { } 
}; 

symbol_type<Website> website(website_names, website_values); 
symbol_type<Currency> currency(currency_names, currency_values); 
2

如果我明白你的問題,你可以使用下面的代碼:

typedef qi::symbols<char, Website> website_; 
typedef qi::symbols<char, Currency> currency_name_; 
+0

好吧,讓我的答案看起來完全愚蠢 –

+0

爲什麼你的答案看起來很愚蠢,當它也需要初始化結構氣的護理: :具有給定值的符號? – engineerX

+0

什麼,像'website_網站(website_names,website_values);'?即使_that_比我好! –