zoukankan      html  css  js  c++  java
  • 【C++】模板简述(五):类型萃取

    功能

      类型萃取,在STL中用到的比较多,用于判断一个变量是否为POD类型.

      简述来说可以用来判断出某个变量是内置类型还是自定义类型.

      通过类型萃取,萃取到变量类型,对不同变量进行不同处理,可以提升程序效率.

    应用场景

      比如我们实现顺序表,在对顺序表进行扩容时,就靠重新开辟内存、拷贝对象.

      拷贝对象时,就有两种情况:一种是类型,比如int char...;还有一种是自定义类型,Data类、String类.

      对于内置类型,我们可以通过memset,来进行赋值.(扩展,浅拷贝相关的类也可以通过memset赋值)

      而对于自定义类型,大多数深拷贝的对象来说,我们必须通过调用赋值语句来赋值.

      因此,我们通常在拷贝对象时,为了不出现错误,都用赋值语句来赋值.

      而我们如果有一种方法/机制可以判断POD类型或者非POD类型.

      对于POD类型用memset函数,对于非POD用赋值,这样就能提高程序的效率

    实现

      类型萃取,在技术层面,就是利用了模板的特化.

      简单类型萃取的实现代码:

    template<typename T>
    struct TypeTraits{
    	static bool IsPODType(){
    		return false;
    	}
    };
    //特化int
    template<>
    struct TypeTraits<int>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    //特化unsigned int
    template<>
    struct TypeTraits<unsigned int>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    
    template<>
    struct TypeTraits<char>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    
    template<>
    struct TypeTraits<unsigned char>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    
    template<>
    struct TypeTraits<short>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    
    template<>
    struct TypeTraits<unsigned short>{
    	static bool IsPODType(){
    		return true;
    	}
    };
    //.....更多类型,继续特化就好
    

       测试代码:

    #include<iostream>
    template<typename T>
    void CheckTypeTraits(T &v){
    	std::cout<<v<<"是POD类型?"<<TypeTraits<T>::IsPODType()<<std::endl;
    }
    
    int main(){
    	int a = 1;
    	char b = '2';
    	short c = 3;
    	float d = 4.4;	//没有特化处理,因此返回0
    	CheckTypeTraits(a);
    	CheckTypeTraits(b);
    	CheckTypeTraits(c);
    	CheckTypeTraits(d);	
    	return 0;
    }
    
  • 相关阅读:
    C语言写的trim()函数
    TCP/IP和Socket的关系
    sizeof(数组名)和sizeof(指针)
    字符数组和结束符/0之间的关系
    C语言中二维字符数组的定义和初始化
    异步套接字基础:select函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
    do{...}while(0)的意义和用法
    Mirror--如何在主库上增加文件
    曲苑杂坛--收缩数据库文件
    常用脚本--SQL Server获取OS日志
  • 原文地址:https://www.cnblogs.com/qq329914874/p/6729481.html
Copyright © 2011-2022 走看看