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

你可能感兴趣的:(C++,c,C#)