力为的技术博客

联系 聚合 管理
  154 Posts :: 1 Stories :: 561 Comments :: 0 Trackbacks

在使用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, floatdouble
        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


    }
posted on 2008-03-29 19:54 力为 阅读(7445) 评论(5)  编辑 收藏 引用 所属分类: 5. GP&STL&BOOST

评论

# re: boost::any 与 boost::variant 的区别 2008-03-31 02:29 eXile
.......我来解释一下吧,
any与variant的最大区别在于效率, any内部实现中使用动态分配, 而variant内部使用栈式分配.
variant为对象联合, 比如说variant<int, std::string>, 你可以理解成下列结构: union { int v1; std::string v2; };  回复  更多评论
  

# re: boost::any 与 boost::variant 的区别 2008-03-31 15:09 力为
欢迎抛砖头~  回复  更多评论
  

# re: boost::any 与 boost::variant 的区别 2008-03-31 22:34 eXile
呵呵,一般情况下,你都应该使用any, 而variant为了提高那么一点点效率, 费的那个劲....
如果要提高效率的话, 可以选择 boost::shared_ptr<void>来代替any  回复  更多评论
  

# re: boost::any 与 boost::variant 的区别 2008-04-02 11:13 力为
@eXile
但any不支持boost::serialization,这一点不知道1.35有没有解决掉。  回复  更多评论
  

# re: boost::any 与 boost::variant 的区别 2011-12-16 15:39 decentman
这个可不能乱理解,string可不能放到union里面@eXile
  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理