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

时间:2014-07-18 15:36:12

标签: c++ boost

我正在尝试使用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?

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

感谢所有帮助。

谢谢!

1 个答案:

答案 0 :(得分:3)

第二个存储为bool,因为它是一个更基本的转换,而不是std::string(编译器更喜欢const char* - &gt; boolconst char* } - &gt; std::string)。由于指针为非null,因此它将布尔值赋值为true。您可以在此处专门构建std::string以解决默认转换问题。

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