posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理
boost::unsafe_any_cast:类型强制转换,不考虑原来的any的类型
    // Note: The "unsafe" versions of any_cast are not part of the
    
// public interface and may be removed at any time. They are
    
// required where we know what type is stored in the any and can't
    
// use typeid() comparison, e.g., when our types may travel across
    
// different shared libraries.
    template<typename ValueType>
    inline ValueType 
* unsafe_any_cast(any * operand)
    {
        
return &static_cast<any::holder<ValueType> *>(operand->content)->held;
    }

    template
<typename ValueType>
    inline 
const ValueType * unsafe_any_cast(const any * operand)
    {
        
return unsafe_any_cast<ValueType>(const_cast<any *>(operand));
    }

boost::any_cast:必须和存的类型一致,否则报错
    template<typename ValueType>
    ValueType 
* any_cast(any * operand)
    {
        
return operand && 
#ifdef BOOST_AUX_ANY_TYPE_ID_NAME
            std::strcmp(operand
->type().name(), typeid(ValueType).name()) == 0
#else
            operand
->type() == typeid(ValueType)
#endif
            
? &static_cast<any::holder<ValueType> *>(operand->content)->held
            : 
0;
    }

    template
<typename ValueType>
    inline 
const ValueType * any_cast(const any * operand)
    {
        
return any_cast<ValueType>(const_cast<any *>(operand));
    }

    template
<typename ValueType>
    ValueType any_cast(any 
& operand)
    {
        typedef BOOST_DEDUCED_TYPENAME remove_reference
<ValueType>::type nonref;

#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
        
// If 'nonref' is still reference type, it means the user has not
        
// specialized 'remove_reference'.

        
// Please use BOOST_BROKEN_COMPILER_TYPE_TRAITS_SPECIALIZATION macro
        
// to generate specialization of remove_reference for your class
        
// See type traits library documentation for details
        BOOST_STATIC_ASSERT(!is_reference<nonref>::value);
#endif

        nonref 
* result = any_cast<nonref>(&operand);
        
if(!result)
            boost::throw_exception(bad_any_cast());
        
return *result;
    }

    template
<typename ValueType>
    inline ValueType any_cast(
const any & operand)
    {
        typedef BOOST_DEDUCED_TYPENAME remove_reference
<ValueType>::type nonref;

#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
        
// The comment in the above version of 'any_cast' explains when this
        
// assert is fired and what to do.
        BOOST_STATIC_ASSERT(!is_reference<nonref>::value);
#endif

        
return any_cast<const nonref &>(const_cast<any &>(operand));
    }
用法:
String abcd = "1.0";
boost::any test 
= abcd;
float abc  =  boost::any_cast<float>(test);//报错
float abc1 = *boost::unsafe_any_cast<float>(&test);//结果也不对, 存什么类型,取出来必须强制转换为什么类型