升压::变体;定义访客类

时间:2013-03-27 13:44:30

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

在Java中,我能够定义泛型类的变量而无需指定类型。

class Tree<T extends Comparable<? super T>> {}
somewhere-else: Tree tree;

然后我可以从文件中读取一些对象并将其类型转换为我想要的类类型。

tree = (Tree<String>) some object;

使用boost::variant我已经开始了变体定义。

typedef boost::variant<Tree<std::string>, Tree<int>> TreeVariant; TreeVariant tree;

我知道我需要指定一个visitor class,但this example如何定义它并不清楚,以便我能够将tree变量分配给Tree<std::string> }或Tree<int>

然后我想从那里继续使用变量tree调用Tree的成员函数。

1 个答案:

答案 0 :(得分:5)

无需创建访问者以将值分配给boost::variant。如本教程的Basic Usage部分所示,您只需指定值:

TreeVariant tree;
Tree<std::string> stringTree;
Tree<int> intTree;
tree = stringTree;
tree = intTree;

对于调用成员函数,您应该使用访问者:

class TreeVisitor : public boost::static_visitor<>
{
public:
  void operator()(Tree<std::string>& tree) const
  {
    // Do something with the string tree
  }

  void operator()(Tree<int>& tree) const
  {
    // Do something with the int tree
  }
};

boost::apply_visitor(TreeVisitor(), tree);

您还可以从static_visitor返回值,如下所示:

class TreeVisitor : public boost::static_visitor<bool>
{
public:
  bool operator()(Tree<std::string>& tree) const
  {
    // Do something with the string tree
    return true;
  }

  bool operator()(Tree<int>& tree) const
  {
    // Do something with the int tree
    return false;
  }
};

bool result = boost::apply_visitor(TreeVisitor(), tree);