有没有办法在其他编译器中实现msvc_typeof?

时间:2014-03-11 17:04:55

标签: c++

在互联网上查看,我找到了 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

0 个答案:

没有答案