在使用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
}
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
}