2017-08-14 17 views
5

std::variant<int, bool>std::get<0>(var)と呼んで、バリアントの値を最初のタイプのintとして取得できます。std :: variantで可能なように、boost :: variantのインデックスでアイテムを取得する

boost::variantでどうすればいいですか? boost::get<>は、索引ではなく種類別にしかサポートされていないようですが、ドキュメントを理解することは非常に困難です。

+0

できないようです。 –

+0

@BaummitAugenとそれをハックする方法はありますか?おそらくいくつかのmpl shenanigansと? – onqtam

+0

はいそうです。どのような基準ですか? –

答えて

5

これは、ブーストに含まれていないようです。

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

それliveを参照してください:

しかし、this answerの助けを借りて、我々は単に私たち自身の役割をすることができます。

ポインタオーバーロードは、必要に応じて同様に追加できます。

+1

ええ、私の悪い - const-nessは、autoを使うだけで正しく伝播してきました。答えをありがとう! IMHOこれは '' 'boost :: variant'''に追加する必要があります... – onqtam

+0

@onqtam寄付を試みたことはありませんでしたが、パッチを提出できると思います。彼らがそれを持っていることに反対する理由を見ないでください。 (C++ 11でどのような標準を使っているのかはっきりしていませんが、これはもう少し醜いものですが、C++ 03でどうやってやるのか分かりません。) –

+0

@onqtamインデックスによるアクセス利用可能なタイプによってアクセス権がある場合、完全なアンチパターンです。 –

関連する問題