Повысьте::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 но из этого примера не ясно, как определить его так, чтобы я мог назначить его tree либо переменная Tree<std::string> или же Tree<int>,

Затем я хотел бы перейти оттуда к функциям-членам Tree, используя переменную tree,

1 ответ

Решение

Нет необходимости создавать посетителя для назначения значений 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);

Вы также можете вернуть значения из 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);
Другие вопросы по тегам