Требуется ли класс посетителя boost :: option?

Должен ли я использовать класс посетителя, такой как class Visitor : public boost::static_visitor<> с бустом :: вариант?

Если нет, есть ли причины не использовать посетителя? Есть ли причины предпочитать класс посетителя?

Я задаю этот вопрос, потому что класс посетителя кажется избыточным аспектом использования boost :: variable.

1

Решение

Вы не обязаны использовать посетителя, вы можете отлично запросить базовый тип, используя 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; перегрузка, которая не обязательно чище.

5

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

Если вы хотите выполнить какую-либо операцию над вариантом, например, какую-нибудь проверку, вы можете захотеть сделать это в качестве посетителя.

struct to_str : boost::static_visitor<std::string>
{
template<class T>
std::string operator()(T const & x) const
{
return boost::lexical_cast<std::string>(x);
}
};

С другой стороны, если вы хотите, например, проверьте, если это int и сделать что-то с этим, вы, вероятно, использовали бы boost::get например

if(const int * my_int = boost::get<int>(&my_var)) //no-throw form
{
//do smth with int
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector