使用 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<<
。
【讨论】:
谢谢,我尝试使用 const char* 代替字符串,效果很好。整数输出问题实际上是一种类型。我试图输出一个不存在的对 (myMap["PAGE)SIZE1"] 而不是 myMap["PAGE_SIZE"])。以上是关于使用 boost::variant 库制作地图。如何将事物存储和显示为正确的类型?的主要内容,如果未能解决你的问题,请参考以下文章
利用 boost-variant 创建带有 boost::mpl::for_each 的通用工厂方法
使用 boost::mpl 获取 boost::variant 的类型索引
boost::variant 与 bool 和 string