(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算

Posted

技术标签:

【中文标题】(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算【英文标题】:(C++, boost::variant) Datatype of boost variant map and performing mathematical operation over it 【发布时间】:2019-01-23 04:02:59 【问题描述】:

我定义了以下类型的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')

谁能帮我解决这个问题?

【问题讨论】:

“setNumber”等是否在引号中?可以发minimal reproducible example吗? 是的。其实 setNumber, Money, Fight 都是用 "" 的,因为它们是字符串...我会修改它们。 【参考方案1】:

您必须使用boost::get&lt;T&gt; 来推断您要从变体中获取的类型...

#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;

编辑:此外,如果您考虑使用全局变量,则此代码可以更短...如果您需要其他任何变量,请改用references访问/修改变量的函数...

#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;

【讨论】:

以上是关于(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算的主要内容,如果未能解决你的问题,请参考以下文章

(C++, boost::variant) boost 变体映射的数据类型并对其执行数学运算

boost::variant 如何存储引用?

Boost Variant 本质上是 C/C++ 中的联合?

Boost::Variant 和其中的 function_types:如何将函数放入 Boost::variant?

boost::variant 隐式转换为字符串

将由 boost::variant 聚合的类型的对象传递给接受该 boost::variant 的函数