5

検討:

typedef boost::variant<T0, ..., TN> variant_T_t;
typedef boost::variant<U0, ..., UN> variant_U_t;
...
typedef boost::variant<variant_T_t, variant_U_t, ...> variant_t;

これにより、 my type が保持できる型の数の制限が に拡張されます。pow(BOOST_VARIANT_LIMIT_TYPES, L)ここで、Lはネストされたレベルの数です。

これは(ある程度)許容できる解決策ですか、それとも単に悪いハックですか?そこにもっと良い解決策はありますか?おそらく、昔ながらのunionほうが適切でしょうか?

4

2 に答える 2

4

ブースト 1.57 の時点で、ブースト バリアントは を介し​​て作成できboost::make_variant_overます。これは、型 Sequence を型パラメーターとして受け取ります。そのモデルが boost::mpl のSequence Conceptになるまで、その型に型制限はありません。

バニラの boost::mpl::vector 型リストは、最大 50 型まで使用できます。ただし、C++11 準拠のコンパイラを使用している場合、独自の可変個引数型リストとそのグルー コードを作成することはそれほど難しくなく、MPL Sequenceになります。この時点から、型の数は、コンパイラが許可するテンプレートのインスタンス化の最大深さ (通常は 256) によって制限されます。

このGISTでは、Dave Abraham のタイプリストを使用してグルー コードを追加しているため、mpl のシーケンス コンセプトをモデル化しています。いくつかのコンパイラで徹底的なテストを行っていないことに注意してください.boost 1.56でテストしただけです.

于 2015-03-17T18:02:36.257 に答える
3

それは醜いハックです。それはあなたの訪問者またはあなたの get 呼び出しを非常に見苦しく、読みにくくします。

代わりに制限を増やしてみてください - Boost.Variant はそれを と同じになるように定義してBOOST_MPL_LIMIT_LIST_SIZEいます。これは、事前に生成されたヘッダーを無効にするとオーバーライドできます (ただし、これはコンパイル時にヒットします)。

http://www.boost.org/doc/libs/1_53_0/libs/mpl/doc/refmanual/limit-list-size.html

とにかく、なぜこれほど多くの異なるタイプが必要なのですか? これは潜在的な設計上の問題のように思えます。

于 2013-06-10T16:22:56.273 に答える