boost ::变量用法

时间:2011-03-28 14:02:31

标签: c++ variant boost-variant

我正在通过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)?

4 个答案:

答案 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)联盟。

检查documenationtutorial也不会受到伤害。

Boost.Any库在这方面与Boost.Variant没有什么不同(你得到的是你得到的:)),但是boost::any 无界:你可以存储价值在boost::any中的任何类型,但在boost::variant中,您只能存储变体模板参数声明的内容。

答案 3 :(得分:0)

boost::variant不会为您进行转化。还有其他单独的方法可以将字符串转换为整数,例如strtol()sscanf()boost::lexical_cast<>() ......