一、boost::any 基本知识
1.1 boost::any()
作用:是定义一个变量来存放任意类型的数据,它类似于比如像纯面向对象语言java或.net中的Object类型。
Boost::Any的实现比较简单,Any拥有一个模版构造函数,这使他可以接受任何类型的对象。真正的变量内容被封装在嵌套类类型的成员变量中,并且在嵌套类中使用typeid来记录真正的类型信息。
#include <iostream>
#include <list>
#include <boost/any.hpp>
typedef std::list<boost::any> list_any; // 类型定义
void fill_list(list_any& la) {
la.push_back(10); // 存放整数
la.push_back(std::string("glemontree")); // 存放字符串对象,不能是la.push_back("glemontree"),否则会被当做字符串数组
}
1.2 boost::any_cast
作用:取出any对象中存放的数据
void show_list(list_any& la) {
list_any::iterator it;
boost::any anyone;
for (it = la.begin; it!= la.end(); ++it) {
anyone = *it;
// C++中,typeid用于返回指针或引用所指对象的实际类型,typeid是操作符,不是函数
if (anyone.type() == typeid(int)) {
std::cout << boost::any_cast<int>(*it) << std::endl;
}
else if (anyone.type() == typeid(std::string)) {
// c_str()函数返回一个指向正规C字符串的指针,内容与本string相同
std::cout << boost::any_cast<std::string>(*it).c_str() << std::endl;
}
}
}
1.3 boost::variant
通过boost的variant类型,variant类型可以表示任意一种类型和any类型有些相似,但还是有些区别,比如说variant支持的类型需提前定义,而any类型不需要,获取any类型的值需要给出原始类型,然而variant类型支持多种方式访问,其中一种就是通过访问者模式来访问,是不需要给出原始类型的
#include <boost/variant.hpp>
#include <string>
int main() {
boost::variant<double, char, std::string> v;
v = 3.14;
v = 'A';
v = "Boost";
}
1.4 boost::get
#include <boost/variant.hpp>
#include <string>
#include <iostream>
int main() {
boost::variant<double, char, std::string> v;
v = 3.14;
std::cout << boost::get<double>(v) << std::endl;
v = 'A';
std::cout << boost::get<char>(v) << std::endl;
v = "Boost";
std::cout << boost::get<std::string>(v) << std::endl;
return 0;
}
参考文献:
【1】[C++] C++中boost::any的使用:https://blog.csdn.net/u010216743/article/details/77772078
【2】C++boost库之variant使用:https://blog.csdn.net/Zhoujy1996/article/details/73554823
【3】boost variant: https://www.cnblogs.com/sssblog/p/11060811.html