- 論壇徽章:
- 0
|
本帖最后由 幻の上帝 于 2010-12-22 16:30 編輯
求一個(gè)元編程實(shí)現(xiàn)的根據(jù)源類(lèi)型在編譯期選擇策略的類(lèi)型轉(zhuǎn)換模板(C++03),具體需求如下:
1.對(duì)于非類(lèi)類(lèi)型引用/指針,使用static_cast;
2.對(duì)于非多態(tài)類(lèi)的類(lèi)類(lèi)型引用/指針,使用static_cast;
3.對(duì)于安全的upcast(源類(lèi)型是目標(biāo)類(lèi)型的派生類(lèi)),使用static_cast;
4.對(duì)于非安全的upcast(源類(lèi)型不是目標(biāo)類(lèi)型的派生類(lèi))或者非多態(tài)虛基類(lèi)的downcast,產(chǎn)生編譯錯(cuò)誤;
5.對(duì)于源類(lèi)型是目標(biāo)類(lèi)型(去除引用/指針)的虛基類(lèi)的引用/指針的downcast,使用dynamic_cast;
6.對(duì)于其它的crosscast,使用dynamic_cast;
7.對(duì)于其它的downcast,使用類(lèi)似boost::polymorphic_downcast的實(shí)現(xiàn)。
貌似過(guò)于復(fù)雜了……所以我實(shí)現(xiàn)不出來(lái)- -...
一個(gè)問(wèn)題是不知道是不是有辦法能在編譯期確定是不是有虛基類(lèi)……
附現(xiàn)有實(shí)現(xiàn):
- namespace _impl
- {
- template<typename _type, typename _type2, bool _bIsPolymorphicClass>
- struct _general_cast_helper
- {
- inline static _type
- cast(_type2 s)
- {
- return dynamic_cast<_type>(s);
- }
- };
- template<typename _type, typename _type2>
- struct _general_cast_helper<_type, _type2, false>
- {
- inline static _type
- cast(_type2 s)
- {
- return static_cast<_type>(s);
- }
- };
- template<typename _type>
- struct _general_cast_helper<_type, _type, true>
- {
- inline static _type
- cast(_type s)
- {
- return s;
- }
- };
- template<typename _type>
- struct _general_cast_helper<_type, _type, false>
- {
- inline static _type
- cast(_type s)
- {
- return s;
- }
- };
- }
- /*!
- \brief 類(lèi)型轉(zhuǎn)換:源類(lèi)型為多態(tài)類(lèi)時(shí)同 dynamic_cast ,否則同 static_cast 。
- */
- template<typename _tDst, typename _tSrc>
- inline _tDst
- general_cast(_tSrc* s)
- {
- return _impl::_general_cast_helper<_tDst, _tSrc*,
- std::tr1::is_polymorphic<_tSrc>::value>::cast(s);
- }
- /*!
- \brief 類(lèi)型轉(zhuǎn)換:源類(lèi)型為多態(tài)類(lèi)時(shí)同 dynamic_cast ,否則同 static_cast 。
- */
- template<typename _tDst, typename _tSrc>
- inline const _tDst
- general_cast(const _tSrc* s)
- {
- return _impl::_general_cast_helper<_tDst, _tSrc*,
- std::tr1::is_polymorphic<_tSrc>::value>::cast(s);
- }
- /*!
- \brief 類(lèi)型轉(zhuǎn)換:源類(lèi)型為多態(tài)類(lèi)時(shí)同 dynamic_cast ,否則同 static_cast 。
- */
- template<typename _tDst, typename _tSrc>
- inline _tDst
- general_cast(_tSrc& s)
- {
- return _impl::_general_cast_helper<_tDst, _tSrc&,
- std::tr1::is_polymorphic<_tSrc>::value>::cast(s);
- }
- /*!
- \brief 類(lèi)型轉(zhuǎn)換:源類(lèi)型為多態(tài)類(lèi)時(shí)同 dynamic_cast ,否則同 static_cast 。
- */
- template<typename _tDst, typename _tSrc>
- inline const _tDst
- general_cast(const _tSrc& s)
- {
- return _impl::_general_cast_helper<_tDst, _tSrc&,
- std::tr1::is_polymorphic<_tSrc>::value>::cast(s);
- }
復(fù)制代碼 |
|