をテンプレート 'Visitor' クラスのパラメーターとして使用したいと思いboost.variant<T0,T1,T2>
ます。このクラスは、boost.variant ビジター メカニズムで必要なビジター オペレーターを提供します。この場合、すべて void を返します。
void operator()(T0 value);
void operator()(T1 value);
void operator()(T2 value);
テンプレートには、バリアント内の各タイプ T0... に対して、デフォルトでは何もしない対応する仮想関数もあります。ユーザーはテンプレート クラスから継承し、関心のある仮想関数のみを再定義できます。これは、よく知られている「テンプレート メソッド」パターンに似たものです。私が思いついた唯一の解決策は、boost::variant と関連するビジターの両方を 1 つのテンプレートにラップし、typedef を介してそれらにアクセスすることです。これは問題なく動作しますが、少しぎこちなく感じます。コードは次のとおりです。
#include "boost/variant.hpp"
//create specializations of VariantWrapper for different numbers of variants -
//just show a template for a variant with three types here.
//variadic template parameter list would be even better!
template<typename T0, typename T1, typename T2>
struct VariantWrapper
{
//the type for the variant
typedef boost::variant<T0,T1,T2> VariantType;
//The visitor class for this variant
struct Visitor : public boost::static_visitor<>
{
void operator()(T0 value)
{
Process(value);
}
void operator()(T1 value)
{
Process(value);
}
void operator()(T2 value)
{
Process(value);
}
virtual void Process(T0 val){/*do nothing */}
virtual void Process(T1 val){/*do nothing */}
virtual void Process(T2 val){/*do nothing */}
protected:
Visitor(){}
};
typedef Visitor VisitorType;
private:
VariantWrapper(){}
};
クラスは次のように使用されます。
typedef VariantWapper<bool,int,double> VariantWrapperType;
typedef VariantWrapperType::VariantType VariantType;
typedef VariantWrapperType::VisitorType VisitorType;
struct Visitor : public VisitorType
{
void Process(bool val){/*do something*/}
void Process(int val){/*do something*/}
/* this class is not interested in the double value */
};
VariantType data(true);
apply_visitor(Visitor(),data);
私が言うように、これは問題なく動作するようですが、バリアントとビジターを結びつける特別なラッパー クラスを作成する必要がなければ、それを好むでしょう。テンプレートのビジター クラスをインスタンス化するために直接 boost.variant を使用できるようにしたいと考えています。型パラメーター、非型パラメーター、およびテンプレート テンプレート パラメーターの使用について調べましたが、何も示唆していないようです。私がやろうとしていることは不可能ですか?私は何かが欠けているかもしれません。誰かがこれについて意見を持っていれば幸いです。