Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不重复地声明许多类似的类_C++_Metaprogramming_Declaration - Fatal编程技术网

C++ C++;不重复地声明许多类似的类

C++ C++;不重复地声明许多类似的类,c++,metaprogramming,declaration,C++,Metaprogramming,Declaration,我想知道一个聪明的方法,避免在下面的类似结构声明中重复我自己。下面代码中的所有结构都公开继承自boost::spirit::qi::symbols,其中每个结构的枚举类型都不同 struct website_ : qi::symbols<char, Website> { website_() : qi::symbols<char, Website>(website_names, Website_values) { } } website_; struct curre

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

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_;
结构网站:qi::符号 { 网站名称:qi::符号(网站名称、网站值){} }网站;; 结构货币名称:qi::符号 { 货币名称():qi::符号(货币名称、货币值){} }货币名称; 例如,在哪里

 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*/ };
enum网站{/*网站列表*/};
const std::vector site_values={/*与上面的列表相同*/};
const std::vector网站名称={/*网站对应名称列表*/};
目标是初始化每个结构,只提供适当的枚举、枚举值向量和带有值名称的字符串向量


我已经想到了一个解决方案,它包含一个新的子类qi::symbols,我的所有结构都将从中继承,但我认为这可能是一种过度使用,另一种可能是使用宏(我不太熟悉)。还有其他使用其他元编程的方法吗?或者我已经在使用Boost库中的其他技巧?

这就是模板被发明的原因

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);
模板
结构符号类型:qi::符号
{
符号类型(常量标准::向量和名称,常量标准::向量和值)
:qi::符号(名称、值){}
};
符号类型网站(网站名称、网站值);
符号类型货币(货币名称、货币值);

这就是模板被发明的原因

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);
模板
结构符号类型:qi::符号
{
符号类型(常量标准::向量和名称,常量标准::向量和值)
:qi::符号(名称、值){}
};
符号类型网站(网站名称、网站值);
符号类型货币(货币名称、货币值);

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

typedef  qi::symbols<char, Website> website_;
typedef  qi::symbols<char, Currency> currency_name_;
typedef qi::symbols网站;
类型定义qi::符号货币名称;

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

typedef  qi::symbols<char, Website> website_;
typedef  qi::symbols<char, Currency> currency_name_;
typedef qi::symbols网站;
类型定义qi::符号货币名称;

为什么你的答案看起来很愚蠢,而它还需要用给定的值初始化struct qi::symbols?什么,比如
website\u网站(website\u名称,website\u值)?甚至那也比我的好!为什么您的答案看起来很愚蠢,而它还需要用给定的值初始化struct qi::symbols?什么,比如
website\uweb(website\u名称,website\u值)?甚至那也比我的好!