2

我正在尝试boost-variant自定义类。我知道访问课程内容的一种安全方法是使用boost::static_visitor. 你知道为什么下面的代码不能编译吗?对使用的签名/声明是否有任何要求boost::static_visitor

我发现了这个问题Why can't I visit this custom type with boost::variant? 但我没明白。

问候

AFG

#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>

struct CA{};

struct ca_visitor : public boost::static_visitor<CA>
{
    const CA& operator()(const CA& obj ) const { return obj;}
};

struct CB{};

struct cb_visitor : public boost::static_visitor<CB>
{
    const CB& operator()(const CB& obj) const { return obj;}
};

int main(){   
    typedef  boost::variant< 
        CA  
        ,CB >  v_type;

    v_type v;
    const CA& a = boost::apply_visitor( ca_visitor(), v );
}
4

1 回答 1

5

首先,模板参数boost::static_visitor<>应该指定调用操作符返回的类型。在您的情况下,ca_visitor' 调用运算符返回 a CA const&,而不是 a CA

但这不是最大的问题。最大的问题是您似乎对如何variant<>以及static_visitor<>应该如何工作存在误解。

a 的想法boost::variant<>是它可以保存您在模板参数列表中指定的任何类型的值。您不知道该类型是什么,因此您为访问者提供了几个重载的调用运算符来处理每种可能的情况。

因此,当您提供访问者时,您需要确保它具有接受您可以持有operator()的类型的所有必要重载。variant如果你不这样做,Boost.Variant 会导致生成一个编译错误(这是在帮你一个忙,因为你忘了处理某些情况)。

这是您面临的问题:您的访问者没有接受类型对象的呼叫操作员CB

这是一个正确使用boost::variant<>and的例子static_visitor<>

#include <iostream>
#include <algorithm>
#include <boost/variant.hpp>

struct A{};
struct B{};

struct my_visitor : public boost::static_visitor<bool>
//                                               ^^^^
//                                               This must be the same as the
//                                               return type of your call 
//                                               operators
{
    bool operator() (const A& obj ) const { return true; }
    bool operator() (const B& obj) const { return false; }
};

int main()
{
    A a;
    B b;
    my_visitor mv;

    typedef boost::variant<A, B> v_type;

    v_type v = a;

    bool res = v.apply_visitor(mv);
    std::cout << res; // Should print 1

    v = b;

    res = v.apply_visitor(mv);
    std::cout << res; // Should print 0
}
于 2013-03-03T14:22:27.750 回答