Я пытаюсь построить std::variant
из boost::variant
. На практике я пытаюсь определить функцию со следующей сигнатурой:
template <typename... Types>
std::variant<Types...>
boostvar2stdvar(boost::variant<Types...> input);
Я видел ответ на этот вопрос, но в этом случае он преобразует кортеж в std::variant, а не в boost::variant. Мне нужно, чтобы моя функция использовала boost::variant напрямую. Есть ли простой способ сделать это?
Честно говоря, я никогда не использовал больше, чем boost::get<>
, но, надеюсь, я смогу научиться @SamVarshavchik
@SamVarshavchik Я пытался до сих пор, но, честно говоря, я потерялся. Я как-то понял первые примеры, но не понимаю, как их использовать
Жаль это слышать, но я уверен, что существует множество учебников или учебных пособий, которые учат, как использовать расширенные шаблоны Boost. И непонятно, что значит "первые примеры". Я не вижу примеров на boost.org/doc/libs/1_80_0/doc/html/boost/apply_visitor.html
Я имел в виду эти: theboostcppplibraries.com/boost.variant Как бы вы использовали boost::apply_visitor для заполнения варианта? @СамВаршавчик
Примерно так, как это показано там, за исключением того, что посетители возвращают std::variant
вместо void
, и каждый посетитель создает std::variant
из посещенного значения и возвращает его, а затем apply_visitor
возвращает сконструированный вариант.
Как указывали другие, вы можете посетить все типы элементов и вернуть оттуда желаемый вариант:
template <typename... Types> auto b2std(boost::variant<Types...> const& input) {
return boost::apply_visitor(
[](auto const& v) -> std::variant<Types...> { return v; }, input);
}
При таком использовании
auto x = b2std(boost::variant<int, std::string, double>{"hello world"});
Тогда тип x соответствует ожидаемому:
static_assert(
std::is_same_v<std::variant<int, std::string, double>, decltype(x)>);
Смотрите Прямой эфир на Колиру
#include <boost/variant.hpp>
#include <variant>
#include <iostream>
template <typename... Types> auto b2std(boost::variant<Types...> const& input) {
return boost::apply_visitor(
[](auto const& v) -> std::variant<Types...> { return v; }, input);
}
int main() {
auto x = b2std(boost::variant<int, std::string, double>{"hello world"});
static_assert(
std::is_same_v<std::variant<int, std::string, double>, decltype(x)>);
}
Знаете ли вы, что делает
boost::apply_visitor
и как его использовать?