boost::any 与 boost::variant 的区别

35 篇文章 1 订阅

在使用boost::any 和 boost::variant的过程中遇到几个小问题,按个人理解对二者做了一下比较。令人最遗憾的是boost::any与boost::serialization 不兼容。 More...


boost::any
* 非模板类
这意味着即时是跨dll也可以方便地使用,支持无限种变量。
* boost::serialization
不支持。有人对此进行了激烈的讨论,在这里

boost::variant
* 模板类
由于模板参数的限制(支持的变量类型需要列在模板参数列表里),因而只支持有限种变量。
如果需要跨DLL使用,声明处需要引用所有需要的变量
* 基于stack
这意味着对于动态创建的对象,内存需要自己管理。
* 支持boost::serialization 

 

 

 Boost::any

Boost::variant

是否模板类

基于stack

是也不是

是否支持boost:: serialization


#ifdef _USE_ANY
    typedef boost::any AcVariant;
#else
    typedef boost::variant
< int , AcString, AcObjectId,  float double
        AcPoint3F, AcColor, AcTrf3F
>  AcVariant;
#endif  


    
//
    template < typename T >
    inline 
bool  fromVariant( const  AcVariant &  var, T &  value)
    
{
#ifdef _USE_ANY
        
try
        
{
            value 
= boost::any_cast<T>(var);
            
return true;
        }

        
catch(const boost::bad_any_cast &)
        
{
            
return false;
        }

#else
        value 
= boost::get<T>(var);
#endif
        
return true;

    }


    template
< typename T >
    inline T fromVariant(
const  AcVariant &  var)
    
{
#ifdef _USE_ANY
        
return boost::any_cast<T>(var);
#else
        
return  boost::get<T>(var);
#endif


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值