Получить элемент по индексу из boost::variant, как это возможно с std::variant

С помощью std::variant<int, bool> я могу вызвать std::get<0>(var), чтобы получить значение в варианте первого типа — int.

Как я могу сделать это с boost::variant? boost::get<>, кажется, поддерживает получение только по типу, а не по индексу, и мне очень сложно понять документацию.


person onqtam    schedule 14.08.2017    source источник
comment
Похоже, ты не можешь.   -  person Baum mit Augen    schedule 14.08.2017
comment
@BaummitAugen, а есть ли способ его взломать? возможно, с какими-то mpl махинациями?   -  person onqtam    schedule 14.08.2017
comment
Скорее всего да. Какой стандарт?   -  person Baum mit Augen    schedule 14.08.2017
comment
@BaummitAugen Я использую (почти) последний из компиляторов - только emscripten заставляет меня отставать - в этой версии libcxx еще нет <variant> ... поэтому C ++ 14 (также последнее повышение)   -  person onqtam    schedule 14.08.2017


Ответы (1)


Кажется, это не включено в boost.

Однако с помощью этого ответа мы можем просто создать собственную роль:

template<int N, typename... Ts> using NthTypeOf =
        typename std::tuple_element<N, std::tuple<Ts...>>::type;

template<int N, typename... Ts>
auto &get(boost::variant<Ts...> &v) {
    using target = NthTypeOf<N, Ts...>;
    return boost::get<target>(v);
}

template<int N, typename... Ts>
auto &get(const boost::variant<Ts...> &v) {
    using target = NthTypeOf<N, Ts...>;
    return boost::get<target>(v);
}

int main () {
    boost::variant<int, double> v = 3.2;
    std::cout << get<1>(v);
}

Смотрите вживую.

Перегрузки указателя, конечно, могут быть добавлены аналогичным образом, если это необходимо.

person Baum mit Augen    schedule 14.08.2017
comment
да, мой плохой - константность правильно распространялась, просто используя auto. Спасибо за ответ! ИМХО это нужно добавить в boost::variant... - person onqtam; 14.08.2017
comment
@onqtam Никогда не пытался внести свой вклад, но я думаю, вы можете отправить патч. Не понимаю, почему они были бы против его наличия. (Хотя я не уверен, какой стандарт они используют, в С++ 11 это уже становится немного более уродливым, и я не уверен, как это сделать в С++ 03.) - person Baum mit Augen; 14.08.2017
comment
@onqtam, я твердо убежден, что доступ по индексу, когда у вас есть доступ по типу, является полным анти-шаблоном. - person Richard Hodges; 14.08.2017
comment
@RichardHodges, в динамической среде очень полезны index() (which() в усилении) и get(). - person Alexis Wilke; 11.06.2019