我正在通过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)?
答案 0 :(得分:20)
您可以使用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
}
答案 1 :(得分:4)
简单回答?不能。您无法通过字符串进行转换,这会导致信息丢失,boost::variant
不会自动尝试解析字符串。
我不知道wxVariant
是否提供了明确的转换 - 通常,如果不对特殊情况进行测试,可能很难转换为boost::variant
。
答案 2 :(得分:1)
boost::variant
(请不要将'v'大写)以另一种方式工作:你只能收回你所放的东西。将其视为类型安全(r)联盟。
检查documenation和tutorial也不会受到伤害。
Boost.Any库在这方面与Boost.Variant没有什么不同(你得到的是你得到的:)),但是boost::any
无界:你可以存储价值在boost::any
中的任何类型,但在boost::variant
中,您只能存储变体模板参数声明的内容。
答案 3 :(得分:0)
boost::variant
不会为您进行转化。还有其他单独的方法可以将字符串转换为整数,例如strtol()
,sscanf()
,boost::lexical_cast<>()
......