2011-08-13 18 views
1

這就是我想做的事:的boost ::變種得到最後一次訪問類型

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

我知道我可以用得到,但我希望能夠做到這一點不指定類型。我可以用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

沒有。

您可以撥打variant<>::which()得到variant<>的當前初始化類型或variant<>::type()的指數以獲得std::type_info爲當前初始化的類型,但也沒有辦法提取比get<>其他當前初始化類型的apply_visitor

2

你可以寫一個輔助函數:

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

// ... 

copy_variant(a, b); 

但嚴重的是,我認爲這會花費你更多比它給你買。

相關問題