2014-10-14 2 views
2

Я использую Boost :: Variant в школьном проекте и struckels для извлечения «float-types» из Variant.Как извлечь <float> из Boost :: Вариант с Boost :: Get?

Я попытался с std :: string и float, и строки отлично работают.

boost::variant<std::string, float> var1; 
    var1 = 123.0F; 
    var1 = "test"; 

    std::string s1 = boost::get<std::string>(var1); 
    float f1 = boost::get<float>(var1); 

Но когда последняя строка запущенной я получить повышение :: bad_get исключение, как он не может найти тип поплавка в Variant?

ответ

2

Это вариант. В то время он может обрабатывать только одно значение. Когда вы звоните boost::get, в варианте нет плавающего варианта.

+0

Ahh теперь я получаю это: D Я через это как контейнер. Однако это больше похоже на «var» на C#. Мультитип, который может принимать разные типы. Большое спасибо! – ChristofferG

+0

Контейнер @ChristofferG - это, например, boost :: tuple. – ForEveR

+0

Я показываю оба boost :: tuple и boost :: fusion :: map в моем ответе, для вдохновения – sehe

2

Что вы ожидаете больше похож на кортеж или слитого карте:

Tuple

Live On Coliru

boost::tuple<std::string, float> var1 = boost::make_tuple("test", 123.0f); 

std::string s1 = boost::get<0>(var1); 
float f1  = boost::get<1>(var1); 

Fusion Карта

Live On Coliru

map< 
    pair<struct name_tag, std::string>, 
    pair<struct value_tag, float> 
> var1 = make_map<name_tag, value_tag>("test", 123.0f); 

std::string s1 = at_key<name_tag>(var1); 
float f1  = at_key<value_tag>(var1); 
+2

Чтобы получить немного ближе к кортежу, теперь в C++ 14 вы можете выполнить 'std :: get (var1);' со стандартным кортежем. – chris

+0

@chris Вы поверили бы этому, я упустил это изменение в C++ 14 o.O – sehe

+0

Поскольку это было школьное задание, в котором я был вынужден использовать boost :: variant. Тем не менее, я ценю ваше предложение с помощью кортежа или карты слияния. Большое спасибо! Я уверен, что это пригодится позже в моей работе;) – ChristofferG

Смежные вопросы