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