1

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

如果不是,是否有理由不使用访问者?有理由更喜欢访客班吗?

我问这个问题是因为访问者类对于 boost::variant 的使用来说是一个多余的方面。

4

2 回答 2

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

这可以说是丑陋的......而且还有一个问题,如果您突然将一种类型添加到变体中,您需要检查代码中的每一次使用,以检查您没有遗漏if某个地方。

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

在我看来,使用boost::static_visitor是无限优越的……尽管我已经使用了get<T>()几次替代方案;通常,当我只需要检查一种(或两种)类型并且(根本)不关心所有其他类型时。另一种方法是使用template <typename T> void operator()(T const&) const;过载的访问者,这不一定更干净。

于 2013-04-03T14:08:32.040 回答
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
}
于 2013-04-03T14:09:38.240 回答