2012-06-20 26 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); 

逸岸你可以概括这个把你的基类的函数指针:

struct fn_generic : public boost::static_visitor<> 
{ 
    fn_generic(void (IBase::fn)()) : fn_(fn) {} 
    template<T> void operator() (T & op) const { op.*fn(); } 
} 
然后你可以这样做:

或者类似的东西 - 我可能有我的函数指针语法错误,但希望你明白了。