我想知道一种聪明的方法,以避免在以下类似结构的声明中重复自己。下面代码中的所有结构都从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的其他一些技巧,我还在使用它?
答案 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_;