7

如果我的所有类型都boost::variant支持相同的方法,有没有办法通用地调用它(即不为 的每个方法单独调用它static_visitor)?

我试图让这样的事情起作用:

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

2 回答 2

4

没有直接的方法,但您可以使用模板使 static_visitor 非常简洁。

从 boost 文档修改:

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(); }
}

然后你可以这样做:

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

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

于 2012-06-20T00:59:17.030 回答
0
class Base {
    virtual void boo() = 0;
};

class A : Base
{
    void boo() override {}
};

class B : Base
{
    void boo() override {}
};

class C : Base
{
    void boo() override {}
};

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

void foo(X& x)
{
    boost::relaxed_get<Base>(x).boo();
}

在上面的示例中不起作用boost::relaxed_get?注意:这需要实时类型信息 (RTTI) 支持。

于 2018-06-14T16:32:21.950 回答