6

With std::variant<int, bool> I can call std::get<0>(var) to get the value in the variant as it's first type - int.

How can I do this with boost::variant? boost::get<> seems to support only getting by type and not by index and I find the documentation very difficult to understand.

Baum mit Augen
  • 49,044
  • 25
  • 144
  • 182
onqtam
  • 4,356
  • 2
  • 28
  • 50

1 Answers1

6

This appears to be not included in boost.

However, with the help of this answer, we can simply role our own:

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);
}

See it live.

The pointer overloads can of course be added analogously if desired.

Baum mit Augen
  • 49,044
  • 25
  • 144
  • 182
  • 1
    yeah my bad - the const-ness got propagated properly by just using auto. Thanks for the answer! IMHO this needs to be added to ```boost::variant```... – onqtam Aug 14 '17 at 14:49
  • @onqtam Never tried contributing, but I guess you could submit a patch. Don't see why they would be against having it. (Not sure what standard they use though, in C++11, this already gets slightly more ugly and I'm not sure how to do it in C++03.) – Baum mit Augen Aug 14 '17 at 14:51
  • @onqtam it is my firm view that access by index, when you have access by type available, is an utter anti-pattern. – Richard Hodges Aug 14 '17 at 14:52
  • @RichardHodges, in a dynamic environment, the `index()` (`which()` in boost) and `get()` are very useful. – Alexis Wilke Jun 11 '19 at 09:13