2011-08-13 4 views
1

を得る:ブースト::バリアントは、これは私が何をしたいです最後にアクセスしたタイプ

boost::variant a<int, string>; 
int b; 
a=4; 
b=a; //doesn't work. What is the easiest way to make b=4? 

私がgetを使用することができます知っているが、私は種類を指定せずにこれを行うことができるようにしたいです。私はapply_visitorとビジターオブジェクトでそれを行うことができますが、より簡単な方法があるかどうかは疑問でした。

答えて

2

あなたがC++ 0xのをサポートし、コンパイラを持っている場合は、使用することができます驚くべきdecltype:あなたはすでにタイプを知っているので、このかかわらずやってみたいと思いますなぜ

boost::variant a<int, string>; 
int b; 
a = 4; 
b = boost::get<decltype(b)>(a); 

は私は知りません。

+3

'a'が' b'と同じ型を持たない場合、これはスローされます。だから、非常に壊れやすいコードです。そのため、一般的に、バリアントを扱うために訪問者を使用したいのです。 –

1

いいえ。

あなたが現在初期化タイプのstd::type_infoを取得するvariant<>の現在初期化タイプまたはvariant<>::type()のインデックスを取得するためにvariant<>::which()を呼び出すことができますが、get<>以外の現在初期化タイプのを抽出する方法はありませんおよびapply_visitor。あなたはヘルパー関数記述することができ

2

template <class V, typename T> 
copy_variant(const V& v, T& t) { t = get<T>(v); } 

// ... 

copy_variant(a, b); 

しかし、真剣に、私は、これはあなたにそれがあなたを買うよりも多くの費用がかかると思います。

関連する問題