[英]boost::variant usage
我正在通過wxWidgets開發GUI應用程序。 它有兩部分:GUI部分和“邏輯”部分。 我希望Logic部分完全獨立於wxWidgets。 但GUI中的一個組件返回wxVariant,我需要在邏輯部分使用它。
所以我正在尋找一種方法將wxVariant“轉換”為boost :: variant
wxVariant的工作原理如下:
wxVariant v("37");
int i = v.GetInteger(); //i==37
所以我在想類似的東西
string s = methodReturningWxVariant().GetString();
boost::variant bV(s);
//later in code e.g
bV.GetInt();
bV.GetBool();
可以像這樣使用boost :: Variant(或boost :: Any)嗎?
您可以使用boost::variant
進行一些更改。 首先,你需要告訴boost::variant
它將存儲哪些類型:
boost::variant<int, string, bool> v;
由於您可能會在幾個地方使用此類型,因此您可能希望為其創建別名。 即
typedef boost::variant<int, string, bool> myvar;
然后你可以直接使用myvar:
myvar x = "hello";
myvar y = 20;
myvar z = false;
檢索值:
string s = boost::get<string>(x);
int i = boost::get<int>(y);
bool b = boost::get<bool>(z);
如果嘗試獲取的類型與存儲在變體中的類型不同,則會引發異常。
您可以使用which()成員函數查詢變體的類型。 它將返回基於0的索引到變體當前持有的類型。
switch (x.which()) {
case 0: // it's an int
case 1: // it's a string
case 2: // it's a bool
}
簡單回答? 不能。你不能通過字符串轉換,這會導致信息丟失,而boost::variant
不會自動嘗試解析字符串。
我不知道wxVariant
是否提供了顯式轉換 - 通常,如果不對特殊情況進行測試,可能很難轉換為boost::variant
。
boost::variant
不會為你做轉換。 還有其他單獨的方法將字符串轉換為整數,例如strtol()
, sscanf()
, boost::lexical_cast<>()
......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.