C ++声明许多类似的类而不重复自己

时间:2012-11-07 23:11:46

标签: c++ metaprogramming declaration

我想知道一种聪明的方法,以避免在以下类似结构的声明中重复自己。下面代码中的所有结构都从boost :: spirit :: qi :: symbols公开继承,其中EnumType对于每个结构都是不同的。

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 Library的其他一些技巧,我还在使用它?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

如果我理解了您的问题,您可以使用以下代码:

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