boost :: variant访客类是否需要?

时间:2013-04-03 14:01:25

标签: c++ boost-variant apply-visitor

我是否需要使用class Visitor : public boost::static_visitor<>访问者类和boost :: variant?

如果没有,是否有理由不使用访客?是否有理由选择访客班?

我问这个问题,因为访问者类似乎是使用boost :: variant的一个多余方面。

2 个答案:

答案 0 :(得分:5)

您不必使用访问者,您可以使用get<T>()完美地查询基础类型。

这导致了这样的代码:

int foo(boost::variant<int, std::string, Bar> const& v) {
    if (int const* i = get<int>(&v)) {
        return *i;
    }
    if (std::string const* s = get<std::string>(&v)) {
        return boost::lexical_cast<int>(*s);
    }
    if (Bar const* b = get<Bar>(&v)) {
        return b->toInt();
    }

    std::abort(); // ?
}

这可能是丑陋的...而且还有一个问题,如果你在变量中添加一种类型突然你需要在代码中检查它的每一次使用来检查你是不是错过了{{1}某处。

另一方面,如果您使用变体,如果您无法处理案例(类型),您将收到编译时错误的通知。

在我看来,使用if无限优越......虽然我曾多次使用boost::static_visitor替代品;通常当我只需要检查一种(或两种)类型而不关心(根本不关心)所有其他类型时。另一种方法是使用get<T>()超载的访客,这不一定更干净。

答案 1 :(得分:0)

如果想要对变体进行某些操作,例如某些检查,则可能需要将其作为访问者。

struct to_str : boost::static_visitor<std::string>
{
   template<class T>
   std::string operator()(T const & x) const
   {
      return boost::lexical_cast<std::string>(x);
   }
};

另一方面,如果你想要,例如检查它是否int并对它做了什么,你可能会使用boost::get,例如。

if(const int * my_int = boost::get<int>(&my_var)) //no-throw form
{
  //do smth with int
}