使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?

Posted

技术标签:

【中文标题】使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?【英文标题】:Making maps using the boost::variant library. How to store and display things as the proper type? 【发布时间】:2014-07-18 15:36:11 【问题描述】:

我正在尝试使用 boost::variant 库创建地图,但我似乎无法正确打印地图中保存的任何数据。

代码:

#include <string>
#include <iostream>
#include "boost_1_55_0/boost/any.hpp"
#include "boost_1_55_0/boost/variant.hpp"
#include <map>
#include <list>
#include <complex>
#include <vector>
using namespace std;

int main()

    std::map <string, boost::variant <int, double, bool, string> > myMap;
    myMap.insert(pair<string, int>("PAGE_SIZE",2048));
    myMap.insert(pair<string, boost::variant <int, double,bool, string> > ("PAGE_SIZE2", "hello, this is a string" )); //setup an enum to specify the second value maybe?
    cout << "data page 1: " << myMap["PAGE)SIZE1"] << "\ntype page 1: " << myMap["PAGE_SIZE"].which() << endl;

    cout << "data: " << myMap["PAGE_SIZE2"] << "\ntype: "<< myMap["PAGE_SIZE2"].which()<< endl;
    return 0;


忽略所有额外的包含,我一直在使用这个文件来玩很多不同的想法。当我使用 g++ 编译时,我得到以下信息:

data page 1: 0
type page 1: 0
data page 2: 1
type page 2: 2

我知道第一个变量存储为 int,因此是 0 类型,但为什么它显示的值为 0?

与第二个输出相同,除了我不明白为什么它被存储为布尔值,值是 1(真)吗?

感谢所有帮助。

谢谢!

【问题讨论】:

wrt 示例代码:我认为在#include 中指定boost 版本目录不是一个好主意。将 boost_1_55_0 放入您的搜索路径并将其从源中删除。恕我直言。 【参考方案1】:

第二个被存储为bool,因为它比std::string 更基本的转换(编译器更喜欢const char* -> bool 而不是const char* -> std::string)。由于指针非空,它分配布尔值 true。您可以在此处专门构造一个std::string 来解决默认转换问题。

至于为什么数据输出不起作用,我唯一可以怀疑的是可能设置了BOOST_NO_IOSTREAM,导致它没有适当的operator&lt;&lt;

【讨论】:

谢谢,我尝试使用 const char* 代替字符串,效果很好。整数输出问题实际上是一种类型。我试图输出一个不存在的对 (myMap["PAGE)SIZE1"] 而不是 myMap["PAGE_SIZE"])。

以上是关于使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?的主要内容,如果未能解决你的问题,请参考以下文章

利用 boost-variant 创建带有 boost::mpl::for_each 的通用工厂方法

使用 boost::mpl 获取 boost::variant 的类型索引

boost.variant 派生类型:不能使用复制构造函数

boost::variant 与 bool 和 string

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

强大的 boost::variant 序列化