⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 typetraits.t.cpp

📁 高级范型编程
💻 CPP
字号:
#include "typetraits.h"
#include "staticassert.h"
class VBase{
public:
    virtual ~VBase(){
    }
};
class Base :  public virtual VBase  {
public:
    virtual ~Base(){
    }
};
class Base1 : public Base {
};
class Base2 : public Base {};
class MyClass : public Base1,public Base2{
};
struct MyInt{
	operator int(){return 0;}
};
struct MyInt2{
	operator int(){return 0;}
	int i;
};

enum MyEnum{aaa=90};
int main(){
#if 1
	{//is_same
		enum {is = dnc::is_same<char*,double>::value};
		static_assert(!is,is_same);
	}{
		enum {is = dnc::is_same<const char,char>::value};
		static_assert(!is,is_same);
	}{
		enum {is = dnc::is_same<char,char>::value};
		static_assert(is,is_same);
	}{
		enum {is = dnc::is_same<MyClass,Base>::value};
		static_assert(!is,is_same);
	}
	{//is_array
		enum{is = dnc::is_array<int[]>::value};
		static_assert(is,is_array);
	}{		
		enum{is = dnc::is_array<int>::value};
		static_assert(!is,is_array);
	}
	{//is_enum
		enum{is = dnc::is_enum<int>::value};
		static_assert(!is,is_enum);
	}{		
		enum{is = dnc::is_enum<MyEnum>::value};
		static_assert(is,is_enum);
	}{		
		enum{is = dnc::is_enum<int*>::value};
		static_assert(!is,is_enum);
	}{		
		enum{is = dnc::is_enum<Base>::value};
		static_assert(!is,is_enum);
	}{
		enum{is = dnc::is_enum<MyInt>::value};
		static_assert(!is,is_enum);
	}

	{		
		enum{is = dnc::is_enum<int&>::value};
		static_assert(!is,is_enum);
	}{		
		enum{is = dnc::is_enum<MyInt2>::value};
		static_assert(!is,is_enum);
	}
#endif
	{//is_class
		enum {is = dnc::is_class<int>::value};
		static_assert(!is,is_class);
	}{
		enum {is = dnc::is_class<MyClass>::value};
		static_assert(is,is_class);
	}
#if 1
	{//remove
        typedef dnc::remove_pointer<int*>::type type;
        enum {is = dnc::is_same<type,int>::value};
		static_assert(is,remove_pointer);
    }{
        typedef dnc::remove_pointer<void(*)()>::type type;
        void(*call1)();
        type *call2 = 0;
        call1 = call2;
        call2 = call1;
        call2 = 0;
    }

	{//int2type,type2type
		dnc::int2type<0> obj;
		obj = obj;
		dnc::type2type<int> obj2;
		obj2 = obj2;
	}
	{//selector
		typedef dnc::selector<true,int,double>::type type;
		enum{is = dnc::is_same<type,int>::value};
		static_assert(is,selector);	
	}
	{//selector
		typedef dnc::selector<false,int,double>::type type;
		enum{is = dnc::is_same<type,double>::value};
		static_assert(is,selector);	
	}
	{//is_arithmetic
		enum{is = dnc::is_arithmetic<int>::value};
		static_assert(is,is_arithmetic);	
	}{
		enum{is = dnc::is_arithmetic<Base>::value};
		static_assert(!is,is_arithmetic);	
	}{//is_void
		enum{is = dnc::is_void<void>::value};
		static_assert(is,is_void);	
	}{
		enum{is = dnc::is_void<int>::value};
		static_assert(!is,is_void);	
	}
	{//is_convertible
		enum{is = dnc::is_convertible<MyClass,Base1>::value};
		static_assert(is,is_void);	
	}{
		enum{is = dnc::is_convertible<Base1,Base2>::value};
		static_assert(!is,is_void);	
	}{
		enum{is = dnc::is_convertible<int,double>::value};
		static_assert(is,is_void);
	}{
		enum{is = dnc::is_convertible<MyClass*,VBase*>::value};
        static_assert(is,is_void);
	}
#endif
    
#if 1 //is_base_and_derived
    {
 		enum{is = dnc::is_base_and_derived<int,int>::value};
 		static_assert(!is,is_base_and_derived);	
    }{
 		enum{is = dnc::is_base_and_derived_impl2<Base2,Base1>::value};
        	static_assert(!is,is_base_and_derived);
    }{
#ifdef DNC_CANCHECKBASE
        enum{is = dnc::is_base_and_derived<Base,MyClass>::value};
        static_assert(is,is_base_and_derived);
#else
        enum{is = dnc::is_base_and_derived<VBase,MyClass>::value};
 		static_assert(is,is_base_and_derived);
#endif
 	}{
 		enum{is = dnc::is_base_and_derived<Base1,Base2>::value};
 		static_assert(!is,is_base_and_derived);	
 	}{
 		enum{is = dnc::is_base_and_derived<MyClass,int>::value};
 		static_assert(!is,is_base_and_derived);	
 	}{
#ifdef DNC_CANCHECKBASE
        enum{is = dnc::is_base_and_derived<Base,const MyClass>::value};
        static_assert(is,is_base_and_derived);           
#else
        enum{is = dnc::is_base_and_derived<VBase,const MyClass>::value};
 		static_assert(is,is_base_and_derived);
#endif
 	}{
#ifdef DNC_CANCHECKBASE
 		enum{is = dnc::is_base_and_derived<const Base,volatile MyClass>::value};
 		static_assert(is,is_base_and_derived);
#else
        enum{is = dnc::is_base_and_derived<const VBase,volatile MyClass>::value};
        static_assert(is,is_base_and_derived);
                
#endif
 	}{
 		enum{is = dnc::is_base_and_derived<MyClass,MyClass>::value};
 		static_assert(!is,is_base_and_derived);	
 	}
#endif
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -