Вы не обязаны использовать посетителя, вы можете идеально запросить базовый тип, используя 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;
, что не обязательно является чище.
Могу ли я не просто запрос для базового типа с помощью 'SomeVariantVariable.which()', который будет возвращать индекс варианта 'ЬурейеЕ повышения :: variant_variable' декларацию и указать, какой тип: Type1 = 0, Type2 = 1? –
Mushy
@Mushy: вы можете «да», а затем «переключитесь» на это и вызовите 'get()'; но на данный момент вы просто переопределяете код, вызывающий посетителя ... за исключением того, что если кто-то добавляет тип в середине списка, тогда индексы сдвигаются, и, таким образом, 'get()' может возвращать значение null, которое вы должны учитывать для (или аварии). –