c++ boost库学习boost::any用法

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值