2017-08-14 15 views
5

Z std::variant<int, bool> mogę zadzwonić pod numer std::get<0>(var), aby uzyskać wartość w wariancie, ponieważ jest to pierwszy typ - int.Zdobądź przedmiot według indeksu z boost :: wariant jak to jest możliwe z std :: wariant

Jak mogę to zrobić z boost::variant? boost::get<> wydaje się wspierać tylko uzyskiwanie według typu, a nie według indeksu i uważam, że dokumentacja jest bardzo trudna do zrozumienia.

+0

Wygląda na to, że nie możesz. –

+0

@BaummitAugen i czy istnieje sposób na zhackowanie go? może z niektórymi mpl shenanigans? – onqtam

+0

Najprawdopodobniej tak. Jaki standard? –

Odpowiedz

5

Wygląda na to, że nie należy do boost.

Jednak z pomocą this answer, możemy po prostu nasza własna rola:

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

Zobacz live.

Przeciążenie wskaźnika można oczywiście dodać analogicznie w razie potrzeby.

+1

Tak, moja zła - konstytuacja została poprawnie rozmnażana, po prostu używając auto. Dziękuję za odpowiedź! IMHO to musi być dodane do '' 'boost :: variant'''' – onqtam

+0

@onqtam Nigdy nie próbowałem wnosić wkładu, ale myślę, że mógłbyś przesłać łatkę. Nie rozumiem, dlaczego byliby przeciwko temu. (Nie jestem pewien, jakiego standardu używają, w C++ 11, to już robi się trochę brzydsze i nie jestem pewien jak to zrobić w C++ 03.) –

+0

@onqtam jest moim stanowczym poglądem, że dostęp przez indeks , kiedy masz dostęp według typu dostępnego, jest całkowicie przeciwny. –

Powiązane problemy