1

次の同様の構造体の宣言で自分自身を繰り返さないようにする賢い方法を知りたいです。以下のコードのすべての構造体は、boost :: spirit :: qi :: symbolから公に継承されます。ここで、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::symbolの新しいサブクラスを使用した解決策を考えました。これからすべての構造体が継承されますが、それはやり過ぎかもしれないと思います。別の解決策はおそらくマクロを使用します(私はあまり詳しくありません)。他の種類のメタプログラミングを使用する別の方法はありますか?それとも、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 に答える