1

我想知道一种聪明的方法来避免在类似结构的以下声明中重复自己。下面代码中的所有结构都公开继承自 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 中的其他一些技巧?

4

2 回答 2

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);
于 2012-11-07T23:17:40.047 回答
2

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

typedef  qi::symbols<char, Website> website_;
typedef  qi::symbols<char, Currency> currency_name_;
于 2012-11-07T23:22:09.927 回答