Повысьте :: 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,

0

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]