带有自定义类的Boost变体

boost variant with custom classes

本文关键字:Boost 变体 自定义      更新时间:2023-10-16

我正在尝试boost-variant与自定义类。我理解访问类内容的安全方法是使用boost::static_visitor。你知道为什么下面的代码不能编译吗?boost::static_visitor的签字/声明是否有要求才能使用?

我发现了这个问题为什么我不能'我访问这个自定义类型与boost::variant?但我没有得到它。

二自由度陀螺仪

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

首先,boost::static_visitor<>的模板参数应该指定调用操作符返回的类型。在你的例子中,ca_visitor的调用运算符返回CA const&,而不是CA

但这不是最大的问题。最大的问题是你似乎对variant<>static_visitor<>应该如何工作有误解。

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

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

这是你面临的问题:你的访问者没有一个调用操作符接受类型为CB的对象。

这是一个正确使用boost::variant<>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
}