rel*_*xxx 6 c++ variant boost-variant
我正在通过wxWidgets开发GUI应用程序.它有两部分:GUI部分和"逻辑"部分.我希望Logic部分完全独立于wxWidgets.但GUI中的一个组件返回wxVariant,我需要在逻辑部分使用它.
所以我正在寻找一种方法将wxVariant"转换"为boost :: variant
wxVariant的工作原理如下:
wxVariant v("37");
int i = v.GetInteger(); //i==37
Run Code Online (Sandbox Code Playgroud)
所以我在想类似的东西
string s = methodReturningWxVariant().GetString();
boost::variant bV(s);
//later in code e.g
bV.GetInt();
bV.GetBool();
Run Code Online (Sandbox Code Playgroud)
可以像这样使用boost :: Variant(或boost :: Any)吗?
Fer*_*cio 22
您可以使用boost::variant一些更改.首先,您需要告诉boost::variant它将存储哪些类型:
boost::variant<int, string, bool> v;
Run Code Online (Sandbox Code Playgroud)
由于您可能会在几个地方使用此类型,因此您可能希望为其创建别名.即
typedef boost::variant<int, string, bool> myvar;
Run Code Online (Sandbox Code Playgroud)
然后你可以直接使用myvar:
myvar x = "hello";
myvar y = 20;
myvar z = false;
Run Code Online (Sandbox Code Playgroud)
检索值:
string s = boost::get<string>(x);
int i = boost::get<int>(y);
bool b = boost::get<bool>(z);
Run Code Online (Sandbox Code Playgroud)
如果尝试获取的类型与存储在变体中的类型不同,则会引发异常.
您可以使用which()成员函数查询变体的类型.它将返回基于0的索引到变体当前持有的类型.
switch (x.which()) {
case 0: // it's an int
case 1: // it's a string
case 2: // it's a bool
}
Run Code Online (Sandbox Code Playgroud)
简单的回答?不可以。您无法通过字符串进行转换,这会导致信息丢失,并且boost::variant不会自动尝试解析字符串。
我不知道 \xe2\x80\x99t 是否提供显式转换 \xe2\x80\x93 一般来说,如果不测试特殊情况wxVariant可能很难转换。boost::variant
| 归档时间: |
|
| 查看次数: |
18641 次 |
| 最近记录: |