0

在 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;

我知道我需要指定 avisitor class但从这个示例中不清楚如何定义它以便我能够分配给我的tree变量Tree<std::string>or Tree<int>

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

4

1 回答 1

5

无需创建访问者来为boost::variant. 如本教程的基本用法部分所示,您只需分配值:

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

您还可以从 a 返回值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);
于 2013-03-27T13:55:59.930 回答