Вы не обязаны использовать посетителя, вы можете запросить базовый тип, используя get<T>()
.
Это приводит к такому коду:
int foo(boost::variant<int, std::string, Bar> const& v) {
if (int const* i = get<int>(&v)) {
return *i;
}
if (std::string const* s = get<std::string>(&v)) {
return boost::lexical_cast<int>(*s);
}
if (Bar const* b = get<Bar>(&v)) {
return b->toInt();
}
std::abort(); // ?
}
Что, возможно, уродливо... и, кроме того, имеет проблему, заключающуюся в том, что если вы добавите один тип к варианту, вам вдруг понадобится проверить каждое его использование в коде, чтобы убедиться, что вы не пропустили где-то if
.
С другой стороны, если вы используете вариант, если вам когда-либо не удастся обработать случай (тип), вы получите уведомление с ошибкой времени компиляции.
На мой взгляд, использование boost::static_visitor
бесконечно лучше... хотя я пару раз использовал альтернативу get<T>()
; обычно, когда мне нужно проверить только один (или два) типа и не заботиться (вообще) обо всех остальных. Альтернативой может быть использование посетителя с перегрузкой template <typename T> void operator()(T const&) const;
, что не обязательно чище.
person
Matthieu M.
schedule
03.04.2013