功能

  类型萃取,在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++】模板简述(五):类型萃取的更多相关文章

  1. STL的迭代器和类型萃取

    今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...

  2. C++的类型萃取技术

    应该说,迭代器就是一种智能指针,因此,它也就拥有了一般指针的所有特点——能够对其进行*和->操作.但是在遍历容器的时候,不可避免的要对遍历的容器内部有所了解,所以,设计一个迭代器也就自然而然的变 ...

  3. 类型萃取(type traits)

    1. 类型萃取的作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来提高效率或者其他.例如:在STL ...

  4. 第17课 类型萃取(1)_基本的type_traits

    1. type_traits类型萃取 (1)type_traits通过定义一些结构体或类,并利用模板类特化和偏特化的能力,给类型赋予一些特性,这些特性根据类型的不同而异.在程序设计中可以使用这些tra ...

  5. c++11——type_traits 类型萃取

    一. c++ traits traits是c++模板编程中使用的一种技术,主要功能:     把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用tr ...

  6. 头一回发博客,来分享个有关C++类型萃取的编写技巧

    废话不多说,上来贴代码最实在,哈哈! 以下代码量有点多,不过这都是在下一手一手敲出来的,小巧好用,把以下代码复制出来,放到相应的hpp文件即可,VS,GCC下均能编译通过 #include<io ...

  7. C++类型萃取

    stl中的迭代器和C++中的类型萃取: http://www.itnose.net/detail/6487058.html 赐教!

  8. 第19课 类型萃取(3)_类型选择的traits

    1. std::conditional (1)原型:template <bool Cond, class T, class F> struct conditional; //根据条件获取T ...

  9. 第18课 类型萃取(2)_获取返回值类型的traits

    1. 获取可调用对象返回类型 (1)decltype:获取变量或表达式的类型(见第2课) (2)declval及原型 ①原型:template<class T> T&& d ...

随机推荐

  1. eclipse中将web项目部署到tomcat

    eclipse中将web项目部署到tomcat. myeclipse部署WEB项目到tomcat比较方便,但eclipse貌似默认是不会替你将web自动部署到tomcat下的.你Run as该web项 ...

  2. ExtJs 中获取 radiobutton 的值

    ExtJs中使用radiobutton,想在ExtJs本身代码中(注意,不是在后台喔)获取 radioButton 的值,居然发现很难,无从下手的感觉.后来在网上寻寻觅觅,痛苦摸索之后,真是大跌眼镜. ...

  3. Element is not clickable at point SeleniumWebdriverException

    Element is not clickable at point SeleniumWebdriverException | Selenium Easy http://www.seleniumeasy ...

  4. accp

    ACCP(Aptech Certified Computer Professional)是印度最早从事IT职业教育的Aptech计算机教育公司推出的培养软件程序设计人员的课程体系,由北大青鸟集团于20 ...

  5. bzoj3330: [BeiJing2013]分数

    口胡 题目hint都给你是一个三分函数了 还不会上三分套三分吗 exp函数又卡 精度又卡 什么sb毒瘤题 浪费时间

  6. mac系统下如何删除银行安全插件

    要分类解决了,一般safair插件都是pkg包安装的 如果:1.制作者够良心,PKG安装包中植入了删除卸载功能,那就好办了,打开当时安装的pkg包,执行删除选项 2.没良心的,装了不好删的,我目前个人 ...

  7. 并不对劲的bzoj5341:loj2553:uoj400:p4565:[Ctsc2018]暴力写挂

    题目大意 有两棵\(n\)(\(n\leq366666\))个节点的树,\(T\)和\(T'\),有边权 \(dep(i)\)表示在\(T\)中\(i\)号点到\(1\)号点的距离,\(dep'(i) ...

  8. gevent 协程 使用

    Python通过yield提供了对协程的基本支持,但是不完全.而第三方的gevent为Python提供了比较完善的协程支持. gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一 ...

  9. Linux中的工作队列

    工作队列(work queue)是Linux kernel中将工作推后执行的一种机制.这种机制和BH或Tasklets不同之处在于工作队列是把推后的工作交由一个内核线程去执行,因此工作队列的优势就在于 ...

  10. bzoj1798 1

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 5866  Solved: 2079[Submit ...