C++ — 类型萃取
类型萃取
特化==>
template<class T>
class A
{
public:A():a(0){}~A(){cout << "这里走了原始的模板"<< endl;}
protected:T a;
};template<>
class A<int>
{
public:A():a(0){}~A(){cout << "这里走了全特化后int的版本" << endl;}
protected:int a;
};void test2()
{A<char> a;A<int> b;
}
应用实例:
void _CheckCapacity(){if (_size >= _capacity){if (TypeTraits <T>::__IsPODType().Get()){cout << "这里是内置类型扩容的情况" << endl;_a = (T*)realloc(_a, (_capacity * 2 + 3)*sizeof(T));_capacity = _capacity * 2 + 3;}else{if (_a == NULL){_a = new T[3];}cout << "这里是非内置类型扩容的情况" << endl;_capacity = _capacity * 2 + 3;T* tmp = new T[_capacity];if (_a){for (size_t i = 0; i < _size; ++i){tmp[i] = _a[i];}delete[] _a;_a = tmp;}}}}
struct __TrueType
{bool Get(){return true;}
};struct __FalseType
{bool Get(){return false;}
};
template <class _Tp>
struct TypeTraits
{typedef __FalseType __IsPODType;
};
//从这开始都是特化版本(类型萃取的开始)
template <>
struct TypeTraits< char>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned char >
{typedef __TrueType __IsPODType;
};
//***********************************************************************************************************//类型萃取
//***********************************************************************************************************//
struct __TrueType
{bool Get(){return true;}
};struct __FalseType
{bool Get(){return false;}
};template <class _Tp>
struct TypeTraits
{typedef __FalseType __IsPODType;
};template <>
struct TypeTraits< char>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned char >
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< bool>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< short>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned short >
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< int>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned int >
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< long>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned long >
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< long long >
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< unsigned long long>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< float>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< double>
{typedef __TrueType __IsPODType;
};template <>
struct TypeTraits< long double >
{typedef __TrueType __IsPODType;
};template <class _Tp>
struct TypeTraits< _Tp*>
{typedef __TrueType __IsPODType;
};typedef int DataType;
template <class T>
class SeqList
{
public:SeqList():_a(NULL), _capacity(0), _size(0){}SeqList(const SeqList<T>& s){_a = new T[s._size];memcpy(_a, s._a, sizeof(T)*s._size);_size = s._size;_capacity = s._size;}SeqList<T>& operator= (SeqList<T> s){swap(_size, s._size);swap(_capacity, s._capacity);swap(_a, s._a);return *this;}~SeqList(){if (TypeTraits <T>::__IsPODType().Get()){free(_a);_capacity = _size = 0;}else{delete[] _a;_capacity = _size = 0;}}void PushBack(const T& x){_CheckCapacity();_a[_size] = x;++_size;}void PopBack(){if (_size > 0)--_size;}T& Back(){assert(_size > 0);return _a[_size - 1];}size_t Size(){return _size;}bool Empty(){return _size == 0;}void Print();void _CheckCapacity(){if (_size >= _capacity){if (TypeTraits <T>::__IsPODType().Get()){cout << "这里是内置类型扩容的情况" << endl;_a = (T*)realloc(_a, (_capacity * 2 + 3)*sizeof(T));_capacity = _capacity * 2 + 3;}else{if (_a == NULL){_a = new T[3];}cout << "这里是非内置类型扩容的情况" << endl;_capacity = _capacity * 2 + 3;T* tmp = new T[_capacity];if (_a){for (size_t i = 0; i < _size; ++i){tmp[i] = _a[i];}delete[] _a;_a = tmp;}}}}
protected:T* _a;size_t _size;size_t _capacity;
};
template<class T>
void SeqList<T>::Print()
{for (size_t i = 0; i < _size; ++i){cout << _a[i] << " ";}cout << endl;
}void Test()
{SeqList<int> a;a.PushBack(1);a.PushBack(2);a.PushBack(3);a.PushBack(9999999);a.Print();SeqList<string> b;b.PushBack("a");b.PushBack("b");b.PushBack("c");b.PushBack("zhangchenliang");b.Print();
}
C++ — 类型萃取相关推荐
- C++特化的应用——类型萃取
提出问题:如何实现一个对于拷贝内置类型和自定义类型通用的拷贝函数? 1.拷贝内置类型 对于内置类型我们可以用memcpy进行拷贝,因为memcpy属于浅拷贝,内置类型不涉及资源管理的问题. 2.拷贝自 ...
- C/Cpp / STL / 类型萃取
作用 类型萃取使用模板技术来萃取类型(包含自定义类型和内置类型)的某些特性,用以判断该类型是否含有某些特性,从而在泛型算法中来对该类型进行特殊的处理用来达到提高效率或者其他的目的. 类型萃取的实现的基 ...
- C++的类型萃取技术
http://www.cppblog.com/nacci/archive/2005/11/03/911.aspx?spm=0.0.0.0.iyJqvt&file=911.aspx 自从C++中 ...
- C++之类型萃取技巧
使用类型萃取的原因 就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储存少于16个的时候这时会储存在_buf ...
- C++类型萃取之type_traits和type_info
类型萃取 类型判断 typeid decltype和declval enable_if 类型萃取 通过type_traits可以实现在编译期计算.查询.判断.转换和选择,增强了泛型编程的能力,也增强了 ...
- type_traits 类型萃取
一. c++ traits traits是c++模板编程中使用的一种技术,主要功能: 把功能相同而参数不同的函数抽象出来,通过traits将不同的参数的相同属性提取出来,在函数中利用这些用traits ...
- C++ 模板类型萃取技术 traits
当函数,类或者一些封装的通用算法中的某些部分会因为数据类型不同而导致处理或逻辑不同(而我们又不希望因为数据类型的差异而修改算法本身的封装时),traits会是一种很好的解决方案.(类型测试发生在编译期 ...
- [c++]——什么是类型萃取
类型萃取 类型萃取从字面意思上来说其实就是帮助我们挑选某个对象的类型,筛选特定的对象来做特定的事. C++中的类型萃取并不是每个人都熟知,他们一般都出现在STL库底层的实现原理中,和笔者一样,相信听到 ...
- C++模板编程之类型萃取 惊鸿一瞥
一.从模板函数std::distance(计算迭代器的距离)开始 #include <iostream> #include <vector> #include <list ...
最新文章
- 关于变量名前面加m的问题
- Java Comparator 珍藏版
- python【力扣LeetCode算法题库】104-二叉树的最大深度
- Android高通平台下编译时能生成(拷贝)预编译的so到system的lib目录
- 利用ASP.netCore自带DI(DependencyInjection)实现批量依赖注入
- 优点 spark_spark(一)
- java中udi_Java读取.properties配置文件的方法
- 微信小程序下拉刷新列表onPullDownRefresh;微信小程序上划加载列表onReachBottom;uni-app微信小程序下拉加载数据;uni-app微信小程序上划页面加载数据
- (王道408考研操作系统)第二章进程管理-第二节4:调度算法详解2(RR、HPF和MFQ)
- 【图像评价】基于matlab GUI图像质量评价【含Matlab源码 1373期】
- informix sybase数据库下载地址
- 海康威视SDKjava二次开发身份证人脸识别
- mac 打开虚拟机之后,原MAC没有声音解决方法
- 复现awvs——POODLE 攻击(带 CBC 密码套件的 SSLv3—CVE-2014-3566)
- android在framework层增加自己的service---仿照GPS
- 下载配置安装MySql---超详细教程
- java script的小基础
- 链塔智库|区块链产业要闻及动态周报(2021年8月第4周)
- 中国直接针对消费者的疾病风险和健康DNA测试行业市场供需与战略研究报告
- 鸿蒙音波萨顶顶,萨顶顶卸妆堪比整容,“神婆”变女神,网友:早就该这样!...