boost :: вариант использования - PullRequest
6 голосов
/ 28 марта 2011

Я разрабатываю приложение с графическим интерфейсом через wxWidgets.Он состоит из двух частей: часть с графическим интерфейсом и часть "логика".Я хочу, чтобы логическая часть была полностью независимой от wxWidgets.Но один компонент в графическом интерфейсе возвращает wxVariant, и мне нужно использовать его в части логики.

Поэтому я ищу способ "преобразовать" wxVariant в boost :: variable

wxVariant worksкак это:

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 ]

21 голосов
/ 28 марта 2011

Возможно, вы можете использовать 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
}
4 голосов
/ 28 марта 2011

Простой ответ?Нет. Вы не можете конвертировать через строки, это вызывает потерю информации, и boost::variant не пытается автоматически анализировать строки.

Я не знаю, предлагает ли wxVariant явное преобразование - в общем, этоможет быть трудно преобразовать в boost::variant без тестирования для особых случаев.

1 голос
/ 28 марта 2011

boost::variant (пожалуйста, не пишите с большой буквы 'v') работает иначе: вы можете получить только то, что положили внутрь. Думайте об этом как о типобезопасном (r) союзе.

Проверка документации и учебник также не повредит.

Boost.Any библиотека не отличается от Boost.Variant в этом отношении (то, что вы кладете, то, что вы получаете :)), но boost::any является неограниченным : вы можете хранить значения любого типа в boost::any, но в boost::variant вы можете хранить только то, что было объявлено параметрами шаблона варианта.

0 голосов
/ 28 марта 2011

boost::variant не делает конвертацию для вас.Существуют и другие отдельные средства для преобразования строки в целое число, например strtol(), sscanf(), boost::lexical_cast<>() ...

...