2016-08-16 9 views
1

これはブーストプリプロセッサで構築されたバリアントはなく可変長テンプレート

template < 
     typename T0_ 
    , BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T) 
    > 
class variant { 

(ここではhttp://www.boost.org/doc/libs/1_49_0/boost/variant/variant.hppた)variant.hppファイルから該当するコードですか?その答えは下位互換性のためかもしれません。はいの場合、上のコードで何が起こっているのですか?プリプロセッサは、どのようにしてユーザレベルのバリデーションテンプレートを使用するような方法で使用できますか?

+0

あなたは[BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES](http://www.boost.org/doc/libs/1_61_0/doc/html/BOOST_VARIANT_DO_NOT_USE_VARIADIC_TEMPLATES.html)フラグつまずいたことがありますか? – starturtle

答えて

2

最近のブーストバージョンを見ると、コンパイラで利用可能な場合は、バリデーションテンプレートが使用されます。

バリデーションテンプレートをお持ちでない場合は、代わりにboost::mplを使用し、最大20種類の値の種類を修正します。 http://www.boost.org/doc/libs/1_61_0/doc/html/BOOST_VARIANT_LIMIT_TYPES.html

主な欠点がある:

  • のでそれはコンパイル時間に有害である最大20

    の大きさの型配列は、例えばここを参照してくださいことはボイラープレートを生成するためのプリプロセッサを使用しています1トンのマクロを展開する必要があります

  • バックグラウンドを調べる必要がある場合は、タイプ名をboost::variantにして、「default argument」/ placeholderのトンでboost::detail::variant::void_をスパムします。 20テ典型的にはそれらのうちのいくつかだけを使用している場合には、これは本当に私を悩ませました、しかし、より多くの経験者が私にそれを乗り越えるように言いました。 :)私は普遍的にvariadicテンプレートは、より良いエラーメッセージとスタックのトレースをもたらすことに同意したと思う。
+0

どのバージョンのブーストを参照していますか?私はちょうど自分のウェブサイトから1_61_0をダウンロードしましたが、それでも同じコードを持っています:( 'boost/variant/variant.hpp'の中で) – Curious

+0

@Curiousどのコンパイラ/バージョンを使っていますか?' std = C++ XYZ'あなたは設定していますか? – starturtle

+0

@TinyTああいいえ私はコードをダウンロードし、私が言及したフォルダに入ってコードを見て、バリデーショナルなテンプレートを見つけられませんでした...私がやっていなければならない何かがありますか? – Curious

関連する問題