boost ::变量用法

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)

  • 没有提到`static_visitor`的Boost.Variant答案? (11认同)

Kon*_*lph 4

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

\n\n

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

\n