约束

来源:互联网 发布:数据分析和前端 编辑:程序博客网 时间:2024/04/29 08:15

// 约束:必须是PODnamespace CoreTools{    template <typename T>    struct MustBePod    {         ~MustBePod()        {            void(*ptr)() = Constranints;            UNREFERENCED_PARAMETER(ptr);         }     private:         static void Constranints()        {             union             {                  T TIsNotPODType;             } unionType;           UNREFERENCED_PARAMETER(unionType);        }     };template <typename T>struct MustBePodOrVoid{~MustBePodOrVoid(){void(*ptr)() = Constranints;UNREFERENCED_PARAMETER(ptr);}private:static void Constranints(){union{T TIsNotPODTypeOrVoid;} unionType;UNREFERENCED_PARAMETER(unionType);}};template <>struct MustBePodOrVoid<void>{};}// 约束:两个类大小必须相等,可能依赖于硬件架构或编译器。namespace CoreTools{template<typename T>struct SizeOf{enum{Value = sizeof(T)};};template<>struct SizeOf<void>{enum{Value = 0};};template <typename T1,typename T2>struct MustBeSameSize{~MustBeSameSize(){void(*ptr)() = Constranints;UNREFERENCED_PARAMETER(ptr);}private:static void Constranints(){const int T1NotSameSizeAsT2 =(static_cast<int>(SizeOf<T1>::Value) ==             static_cast<int>(SizeOf<T2>::Value));int i[T1NotSameSizeAsT2];UNREFERENCED_PARAMETER(i[0]);}};}// 约束:必须可以按下标访问namespace CoreTools{template <typename T>struct MustBeSubscriptable{~MustBeSubscriptable(){void(*ptr)(const T&) = Constranints;UNREFERENCED_PARAMETER(ptr);}private:static void Constranints(const T& TIsNoSubscriptable){   int size = sizeof(TIsNoSubscriptable[0]);UNREFERENCED_PARAMETER(size);TIsNoSubscriptable[0];}};template <typename T>struct MustBeSubscriptableAsDecayablePointer{~MustBeSubscriptableAsDecayablePointer(){void(*ptr)(const T&) = Constranints;UNREFERENCED_PARAMETER(ptr);}private:static void Constranints(T const& TIsNoSubscriptableAsDecayablePointer){   int size = sizeof(0[TIsNoSubscriptableAsDecayablePointer]);UNREFERENCED_PARAMETER(size);UNREFERENCED_PARAMETER(0[TIsNoSubscriptableAsDecayablePointer]);}};}// 约束:类D是类B的派生类或相同类型namespace CoreTools{template <typename D,typename B>struct MustHaveBase{~MustHaveBase(){void(*ptr)(D*,B*) = Constranints;UNREFERENCED_PARAMETER(ptr);}private:static void Constranints(D* derivePtr,B* basePtr){#if defined(__GNUC__)basePtr = derivePtr;if(basePtr != derivePtr){} #elsebasePtr = derivePtr;UNREFERENCED_PARAMETER(basePtr);#endif // __GNUC__ }};}


0 0