В 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
,
Нет необходимости создавать посетителя для назначения значений 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);
Других решений пока нет …