boost any与variant

any:是一种只能容纳一个元素的容器,但这个元素可以是任意类型(int,string,stl容器和任何自定义类型).程序可以用any保存任意的数据。
any不是一个模板类,本身不提供任何对内部元素的访问函数,而是使用了一个友元函数any_cast()

#include<boost/any.hpp>
#include<iostream>
#include<vector>
#include<boost/assign.hpp>
#include<boost/shared_ptr.hpp>
using namespace std;
using namespace boost;

template<typename T>
void print(const T& t)
{
typename T::const_iterator iter;
for(iter=t.begin();iter!=t.end();++iter){
cout << *iter << " ";
}
cout << endl;
}

int main()
{
any a(10);
cout << any_cast<int>(a) << endl;
a = string("abc");
cout << any_cast<string>(a)<<endl;
vector<int> v,x;
using namespace boost::assign;
v = list_of(1)(2)(3);
push_back(v)(4)(5);
a = vector<int>(v);
x = any_cast<vector<int> >(a);
print(x);
//any可以持有原始指针,但不安全,会内存泄漏。应该用智能指针,但auto_ptr不行,它特有的
//拷贝转移语义使得它不能被用作容器的元素
shared_ptr<int> p(new int(3));
a = p;
cout << *any_cast<shared_ptr<int> >(a) << endl;
}

10
abc
1 2 3 4 5
3


variant和any有点类似,是一种可变类型,它是一个模板类,允许保存的数据类型必须在模板参数列表中声明

#include<boost/variant.hpp>
#include<iostream>

using namespace std;
using namespace boost;

template<typename T>
void var_print(T &v)
{
if(v.type()==typeid(int)){
get<int>(v);
cout << v << endl;
}else if(v.type()==typeid(string)){
cout << v << endl;
}else{
try{
cout << "don't know" << endl;
get<int>(v);
}catch(bad_get &){
cout << "bad_get" << endl;
}
}
}

int main()
{
//1.4.2默认最多20个
typedef variant<int,double,string> var_t;
var_t v;
assert(v.type()==typeid(int));//type()用的是第一个:int
assert(v.which()==0);

v = "variant demo";
var_print(v);
v = 2.1;
var_print(v);

}

variant demo
don't know
bad_get
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值