boost 系列二 Any

来源:互联网 发布:网络记者证 知乎 编辑:程序博客网 时间:2024/06/11 15:49

boost::any可以存放任何类型的C++类型,也可以是用户自定义的类型。非常方便,可以很方便的满足在运行过程中判断数据类型,从而进行相关的操作。

{

        typedef std::list<boost::any> list_any;   
        list_any la;   
        
        //存放常数
        la.push_back(10);


        //存放字符串对象;
        //注意la.push_back(“dyunze”)错误,因为会被当错字符串数组 


        la.push_back( std::string("dyunze") );


        list_any::iterator it;   
        boost::any anyone;   
        for( it = la.begin(); it != la.end(); it++ )   
        {      
            anyone = *it;   
            if( anyone.type() == typeid(int) )   
               std::cout<<boost::any_cast<int>(*it)<<std::endl;   
            else if( anyone.type() == typeid(std::string) )   
               std::cout<<boost::any_cast<std::string>(*it).c_str()<<std::endl;   
        }

    }

同样的实现也可以使用 std::list<BaseClass*> mylist; 实现父类的虚接口即可。

boost::any的优点:

     对设计模式理解的朋友都会知道合成模式。因为多态只有在使用指针或引用的情况下才能显现,所以std容器中只能存放指针或引用(但实际上只能存放指针,无法存放引用,这个好像是c++的不足吧)。如:

这样,我们就要对指针所指向内容的生存周期操心(可能需要程序员适时删除申请的内存;但是由于存放指针,插入/删除的效率高),而使用boost::any就可能避免这种情况,因为我们可以存放类型本身(当然存放指针也可以)。这是boost::any的优点之一。

    boost::any另一个优点是可以存放任何类型。而前面提到的mylist只能存放BaseClass类指针以及其继承类的指针。

boost::any的缺点:

    由于boost::any可以存放任何类型,自然它用不了多态特性,没有统一的接口,所以在获取容器中的元素时需要实现判别元素的真正类型,这增加了程序员的负担。与面向对象编程思想有些矛盾,但整个标准c++模板库何尝不是如此,用那些牛人的话来说,是“有益补充”。

   总之,有利必有弊,没有十全十美的。



0 0
原创粉丝点击