(C ++, boost :: option) Тип данных карты вариантов Boost и выполнение над ней математической операции - PullRequest
0 голосов
/ 23 января 2019

Я определил следующий тип d

typedef boost::variant<string, double> flex_String_Double;
map<string, flex_String_Double> FDParam;

, и FDParam имеет следующую форму:

{"setNumber", 3}
{"Money", 3.152}
{"Fight", "No"}

Что я хотел сделать (ожидая получить 6.152):

cout << FDParam["setNumber"] + FDParam["Money"] << endl;

Однако эта команда не работает и выдает следующую ошибку:

Invalid operands to binary expression ('std::__1::map<std::__1::basic_string<char>, boost::variant<std::__1::basic_string<char>, double>, std::__1::less<std::__1::basic_string<char> >, std::__1::allocator<std::__1::pair<const std::__1::basic_string<char>, boost::variant<std::__1::basic_string<char>, double> > > >::mapped_type' (aka 'boost::variant<std::__1::basic_string<char>, double>') and 'double')

Кто-нибудь может мне помочь решить эту проблему?

1 Ответ

0 голосов
/ 23 января 2019

Вы должны использовать boost::get<T>, чтобы вывести тип, который вы хотите взять из варианта ...

#include <iostream>
#include <map>
#include <boost/variant.hpp>

typedef boost::variant<std::string, double> flex_String_Double;
std::map<std::string, flex_String_Double> FDParam;

int main()
{
    FDParam["setNumber"] = 3;
    FDParam["Money"] = 3.152;
    FDParam["Fight"] = "No";
    std::cout << boost::get<double>(FDParam["setNumber"]) + 
                 boost::get<double>(FDParam["Money"]) << std::endl;
    std::cout << "Can Fight? " << boost::get<std::string>(FDParam["Fight"]) << std::endl;
}

Редактировать: Кроме того, этот код можно сделать намного корочеесли вы не рассматриваете возможность использования глобальных переменных ... вместо этого используйте ссылки , если вы хотите, чтобы любая другая функция осуществляла доступ к переменной / изменяла ее ...

#include <iostream>
#include <map>
#include <boost/variant.hpp>

typedef boost::variant<std::string, double> flex_String_Double;

int main()
{
    std::map<std::string, flex_String_Double> FDParam = {
        { "setNumber", 3 },
        { "Money", 3.152 },
        { "Fight", "No" },
    };
    std::cout << boost::get<double>(FDParam["setNumber"]) + 
                 boost::get<double>(FDParam["Money"]) << std::endl;
    std::cout << "Can Fight? " << boost::get<std::string>(FDParam["Fight"]) << std::endl;
}
...