std::variant<int, bool>
std::get<0>(var)
と呼んで、バリアントの値を最初のタイプのint
として取得できます。std :: variantで可能なように、boost :: variantのインデックスでアイテムを取得する
boost::variant
でどうすればいいですか? boost::get<>
は、索引ではなく種類別にしかサポートされていないようですが、ドキュメントを理解することは非常に困難です。
std::variant<int, bool>
std::get<0>(var)
と呼んで、バリアントの値を最初のタイプのint
として取得できます。std :: variantで可能なように、boost :: variantのインデックスでアイテムを取得する
boost::variant
でどうすればいいですか? boost::get<>
は、索引ではなく種類別にしかサポートされていないようですが、ドキュメントを理解することは非常に困難です。
これは、ブーストに含まれていないようです。
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の助けを借りて、我々は単に私たち自身の役割をすることができます。
ポインタオーバーロードは、必要に応じて同様に追加できます。
ええ、私の悪い - const-nessは、autoを使うだけで正しく伝播してきました。答えをありがとう! IMHOこれは '' 'boost :: variant'''に追加する必要があります... – onqtam
@onqtam寄付を試みたことはありませんでしたが、パッチを提出できると思います。彼らがそれを持っていることに反対する理由を見ないでください。 (C++ 11でどのような標準を使っているのかはっきりしていませんが、これはもう少し醜いものですが、C++ 03でどうやってやるのか分かりません。) –
@onqtamインデックスによるアクセス利用可能なタイプによってアクセス権がある場合、完全なアンチパターンです。 –
できないようです。 –
@BaummitAugenとそれをハックする方法はありますか?おそらくいくつかのmpl shenanigansと? – onqtam
はいそうです。どのような基準ですか? –