在使用boost::any 和 boost::variant的過程中遇到幾個小問題,按個人理解對二者做了一下比較。令人最遺憾的是boost::any與boost::serialization 不兼容。 More...
boost::any
* 非模板類
這意味著即時是跨dll也可以方便地使用,支持無限種變量。
* boost::serialization
不支持。有人對此進(jìn)行了激烈的討論,在這里。
boost::variant
* 模板類
由于模板參數(shù)的限制(支持的變量類型需要列在模板參數(shù)列表里),因而只支持有限種變量。
如果需要跨DLL使用,聲明處需要引用所有需要的變量
* 基于stack
這意味著對于動態(tài)創(chuàng)建的對象,內(nèi)存需要自己管理。
* 支持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

}

