在使用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
}
本文探讨了Boost库中Any与Variant两种类型的特性与应用场景。重点介绍了二者在模板使用、内存管理和序列化支持方面的区别,并提供了跨DLL使用的注意事项。
582

被折叠的 条评论
为什么被折叠?



