在互联网上查看,我找到了 this (MSVC类型的实现)。但是,我不确定是否可以,并且如何我可以在任何其他编译器中实现它,而不仅仅是MSVC。
请注意:我不是在寻找register_type
宏,e.t.c,因为我已经实现了这一点。
网站代码:
#if defined(_MSC_VER) && _MSC_VER>=1400
namespace msvc_typeof_impl {
struct msvc_extract_type_default_param {};
template<int ID, typename T = msvc_extract_type_default_param> struct msvc_extract_type;
template<int ID> struct msvc_extract_type<ID, msvc_extract_type_default_param>
{
template<bool> struct id2type_impl;
typedef id2type_impl<true> id2type;
};
template<int ID, typename T> struct msvc_extract_type : msvc_extract_type<ID, msvc_extract_type_default_param>
{
template<> struct id2type_impl<true> //VC8.0 specific bugfeature
{
typedef T type;
};
template<bool> struct id2type_impl;
typedef id2type_impl<true> id2type;
};
template<int N> class CCounter;
// TUnused is required to force compiler to recompile CCountOf class
template<typename TUnused, int NTested = 0> struct CCountOf
{
enum
{
__if_exists(CCounter<NTested>) { count = CCountOf<TUnused, NTested + 1>::count }
__if_not_exists(CCounter<NTested>) { count = NTested }
};
};
template<class TTypeReg, class TUnused, int NValue> struct CProvideCounterValue { enum { value = NValue }; };
// type_id
#define unique_type_id(type) \
(CProvideCounterValue< \
/*register TYPE--ID*/ typename msvc_extract_type<CCountOf<type >::count, type>::id2type, \
/*increment compile-time Counter*/ CCounter<CCountOf<type >::count>, \
/*pass value of Counter*/CCountOf<type >::count \
>::value)
// Lets type_id() be > than 0
class __Increment_type_id { enum { value = unique_type_id(__Increment_type_id) }; };
// vartypeID() returns a type with sizeof(type_id)
template<int NSize> class sized { char m_pad[NSize]; };
template<typename T> typename sized<unique_type_id(T)> vartypeID(T&);
template<typename T> typename sized<unique_type_id(const T)> vartypeID(const T&);
template<typename T> typename sized<unique_type_id(volatile T)> vartypeID(volatile T&);
template<typename T> typename sized<unique_type_id(const volatile T)> vartypeID(const volatile T&);
}
#define typeof(expression) msvc_typeof_impl::msvc_extract_type<sizeof(msvc_typeof_impl::vartypeID(expression))>::id2type::type
#endif