c++之类型萃取

原创 2016年08月30日 21:47:05

刚刚我们接触过模板类,类似于这样的:


在这个类中,我们如何知道它是什么类型的呢?这里,我们可以在类中加入一个内嵌类型,如:


这样就可以知道它是用户自定义的还是本身类型就拥有的,我们用到了类型萃取的方式。我们把__IsPodType叫做内嵌型别。

当我们遇到其他类型时,就将__IsPodType定义为__FalseType;


当遇到自定义类型时,就将__IsPodType定义为__TrueType;

说起这种书写方式,将template<>称为类型的特化。

举一个实在点的例子吧微笑

#include<iostream>
using namespace std;
struct __TrueType
{
	bool Get()
	{
		return true;
	}
};

struct __FalseType
{
	bool Get()
	{
		return false;
	}
};

template<class __Tp>
struct TypeTraits
{
	typedef __FalseType __IsPodType;
};

template<>
struct TypeTraits<int>                //在这里,非自定义类型只列出了int,char,float等这几种,其实还有很多类型,像long long,double,unsigned char等等
{
	typedef __TrueType __IsPodType;
};

template<>
struct TypeTraits<char>
{
	typedef __TrueType __IsPodType;
};

template<>
struct TypeTraits<long>
{
	typedef __TrueType __IsPodType;
};

template<>
struct TypeTraits<unsigned int>
{
	typedef __TrueType __IsPodType;
};

template<>
struct TypeTraits<float>
{
	typedef __TrueType __IsPodType;
};

template<class __Tp>
void Copy(const __Tp* src, __Tp* dst,size_t size,__TrueType)
{
	memcpy(dst,src,size*sizeof(__Tp));      //拷贝的内置类型
}

template<class __Tp>
void Copy(const __Tp* src, __Tp* dst,size_t size,__FalseType)
{
	int i = 0;
	for(i = 0; i < size; i++)
	{
		dst[i] = src[i];
	}
}
<span style="font-family: Arial, Helvetica, sans-serif;">// 使用萃取判断类型的Get函数判断是否是 POD类型来处理</span>
//template<class __Tp>
//void Copy(const __Tp* src, __Tp* dst,size_t size)        //Copy的另外一种写法,不传入类型
//{
//	if(TypeTraits<__Tp>::__IsPodType().Get())          //if判断就可以直接写一个函数,,是上述两个Copy的结合
//	{
//		memcpy(dst,src,size*sizeof(__Tp));
//	}
//	else
//	{
//		int i = 0;
//		for(i = 0; i < size; i++)
//		{
//			dst[i] = src[i];
//		}
//	}
//}

template<class __Tp>
void print(const __Tp* arr,size_t size)
{
	int i = 0;
	for(i = 0; i < size; i++)
	{
		cout<<arr[i]<<" ";
	}
}



int main()
{
	int arr1[] = {1,3,5,7,9};
	int arr2[10];
	int size = sizeof(arr1)/sizeof(arr1[0]);
	Copy(arr1,arr2,size,TypeTraits<int>::__IsPodType());
	/*Copy(arr1,arr2,size);*/
	print(arr2,size);
	return 0;
}

以上是数组的拷贝,用了类型萃取的方式。详细一点说类型萃取技术的由来就是,由于c++模板中类的参数是抽象的,我们不能在模板类中直接获得它的具体特征,我们就用类型萃取(trait)的方式,来抽取类型的具体特征,知道它是什么类型,比如内置类型,自定义类型。

我们可以看到很多模板类的特化,这也是类型萃取的一个基本思想。





版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

c++中的类型萃取

为什么会引入类型萃取??提高程序效率~~~

C++类型萃取

在Seqlist中,我们对于内置类型,通过memcopy和memmove这两个方式进行拷贝,自定义类型或string类型我们要通过for循环赋值的方式拷贝。那么系统如何区分是哪种类型呢?虽然通过typ...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++ 模板类型萃取技术

自从C++中引入了template后,以泛型技术为中心的设计得到了长足的进步。STL就是这个阶段杰出的产物。STL的目标就是要把数据和算法分开,分别对其进行设计,之后通过一种名为iterator的东西...

C++的类型萃取技术

C++的类型萃取技术 自从C++中引入了template后,以泛型技术为中心的设计得到了长足的进步。STL就是这个阶段杰出的产物。STL的目标就是要把数据和算法分开,分别对其进行设计,之后通过一...

C++之类型萃取技巧

在我们前面写顺序表的时候会产生一个问题。使用类型萃取的原因就是当你的顺序表是自定义类型,我们进行顺序表增容的时候,这个时候会出现一个问题,比如string类型,这个类型中有一个_buf与_ptr,当储...

C++类型萃取

#include using namespace std;struct _TrueType { static Get() //使用static修饰成员函数的话,访问该成员函数的话可以用通过类...

C++类型萃取

C++类型萃取

C++ — 类型萃取

类型萃取 类型萃取。

C++模板类的类型萃取技术

模板是泛型编程的基础,所谓泛型编程就是指编写与类型无关的逻辑代码,是一种复用的方式。所以使用模板的目的就是方便程序员编写与类型无关的代码,减少相似代码在程序中出现的概率。 假如我们要编写一个判断两个...
  • tttjp
  • tttjp
  • 2017-04-10 20:07
  • 35

类型萃取

在C++中我们可以通过typeid来获取一个类型的名称(内置类型和自定义类型都可以),但是我们不能用这种方式获取来的名称做变量的声明。那么在C++中怎样识别对象的类型呢??我们可以通过类型萃取的方式来...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)