8

我正在通过 wxWidgets 开发 GUI 应用程序。它有 2 个部分:GUI 部分和“逻辑”部分。我想让逻辑部分完全独立于 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

4 回答 4

23

您可能可以使用boost::variant一些更改。首先,您需要知道boost::variant它将存储哪些类型:

boost::variant<int, string, bool> v;

由于您可能会在一些地方使用这种类型,因此您可能希望为它创建一个别名。IE

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
}
于 2011-03-28T14:17:46.547 回答
4

简单的答案?不可以。您不能通过字符串进行转换,这会导致信息丢失并且boost::variant不会自动尝试解析字符串。

我不知道是否提供了显式转换——一般来说,如果不测试特殊情况wxVariant,可能很难转换。boost::variant

于 2011-03-28T14:09:14.017 回答
1

boost::variant(请不要大写'v')以另一种方式工作:您只能取回您放入的内容。将其视为类型安全(r)联合。

检查文档教程也不会受到伤害。

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

于 2011-03-28T14:08:52.857 回答
0

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

于 2011-03-28T14:09:03.993 回答