2012-06-20 4 views
6

boost::variantのすべての型が同じメソッドをサポートしている場合は、一般的に呼び出す方法がありますか?つまり、static_visitorの各メソッドごとに別々に呼び出す方法はありませんか?boost :: variantの型に共通のメソッドを呼び出す

私は仕事に、このような何かを取得しようとしている:

class A 
{ 
    void boo() {} 
}; 

class B 
{ 
    void boo() {} 
}; 

class C 
{ 
    void boo() {} 
}; 

typedef boost::variant<A, B, C> X; 

void foo(X& d) 
{ 
    x.boo(); 
} 

が、それは'boo' : is not a member of 'boost::variant<T0_,T1,T2>'を言ってコンパイルに失敗しました。

現在、いくつかのクラスはすべて、インターフェイスから継承しているため、それらの単一の共有メソッドを多態的に使用することができます。私はまた、他のすべてのメソッドが各具体的なクラスに固有のものであるため、訪問者を介してクラスを使用できるようにしたいと考えています。私はboost::variantが私の訪問者の仕組みをここに実装するのに良い選択肢かもしれないと思っていました。それは...ですか?

答えて

4

直接的な方法はありませんが、テンプレートを使用してstatic_visitorをきわめて簡潔にすることができます。ブーストのドキュメントから変更

struct boo_generic : public boost::static_visitor<> 
{ 
    template <typename T> 
    void operator()(T & operand) const 
    { 
     operand.boo(); 
    } 
}; 

今、あなたはこれを行うことができます:あなたは、これはあなたの基底クラスの関数ポインタを取るために一般化することができます

boost::apply_visitor(boo_generic(), v); 

がInfactは:

struct fn_generic : public boost::static_visitor<> 
{ 
    fn_generic(void (IBase::fn)()) : fn_(fn) {} 
    template<T> void operator() (T & op) const { op.*fn(); } 
} 

次にできること:

boost::apply_visitor(boo_generic(IBase::boo), v); 

何かのように - 私はおそらく私の関数ポインタの構文が間違っているが、うまくいけば、あなたは考えを得る。

関連する問題