2017-08-14 4 views
5

Avec std::variant<int, bool> Je peux appeler std::get<0>(var) pour obtenir la valeur dans la variante comme c'est premier type - int.Obtenir l'article par index de boost :: variante comme c'est possible avec std :: variante

Comment est-ce que je peux faire ceci avec boost::variant? boost::get<> semble ne supporter que le type et non par index et je trouve la documentation très difficile à comprendre.

+0

On dirait que vous ne pouvez pas. –

+0

@BaummitAugen et y a-t-il un moyen de le pirater? peut-être avec quelques shenanigans mpl? – onqtam

+0

Très probablement oui. Quelle norme? –

Répondre

5

Cela semble ne pas être inclus dans boost.

Cependant, avec l'aide de this answer, nous pouvons simplement notre rôle:

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

Voir ce live.

Les surcharges de pointeur peuvent bien entendu être ajoutées de manière analogue si on le souhaite.

+1

ouais ma mauvaise - la const-ness a été propagée correctement en utilisant simplement auto. Merci d'avoir répondu! À mon humble avis cela doit être ajouté à '' 'boost :: variant''' ... – onqtam

+0

@onqtam N'a jamais essayé de contribuer, mais je suppose que vous pourriez soumettre un correctif. Ne vois pas pourquoi ils seraient contre l'avoir. (Je ne suis pas sûr de la norme qu'ils utilisent, en C++ 11, cela devient déjà un peu plus moche et je ne suis pas sûr de savoir comment le faire en C++ 03.) –

+0

@onqtam c'est mon avis que l'accès par index , lorsque vous avez accès par type disponible, est un anti-pattern complet. –