簡體   English   中英

boost ::變量用法

[英]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 (請不要大寫'v')以另一種方式工作:你只能取回你放入的內容。 將其視為類型安全(r)聯合。

檢查文檔教程也不會受到傷害。

Boost.Any庫在這方面與Boost.Variant沒有區別(你提出的是你得到的:)),但是boost::any無限的 :你可以在boost::any存儲任何類型的值,但是boost::variant只能存儲variant的模板參數聲明的內容。

boost::variant不會為你做轉換。 還有其他單獨的方法將字符串轉換為整數,例如strtol()sscanf()boost::lexical_cast<>() ......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM