欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

模板--类型萃取

程序员文章站 2022-06-10 13:43:03
...

    当我们在实现数据结构vector时,我们发现使用mencpy时只能实现基本类型的拷贝,而不能实现自定义类型的拷贝,比如说字符串类型。这问题如何解决呢?在学习了模板和基于模板的类型萃取之后,我们就有方法是在实现基本类型的拷贝时使用memcpy,在遇到自定义类型时用for循环来拷贝。

#pragma once
#include <typeinfo.h>
#include <iostream>
#include <string>
using namespace std;

struct _TrueType
{};
struct _FalseType
{};

template <class tp>
class _TypeTraits
{
public:
	typedef _FalseType __IsPODType;
};
template <>
class _TypeTraits<bool>
{
	typedef _TrueType __IsPODType;
};
template <>
class _TypeTraits<int>
{
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<char>
{
public:
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<float>
{
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<double>
{
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<unsigned char>
{
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<short>
{
	typedef _TrueType __IsPODType;
}; 
template <>
class _TypeTraits<unsigned short>
{
	typedef _TrueType __IsPODType;
};
template <>
class _TypeTraits<unsigned int>
{
	typedef _TrueType __IsPODType;
};
template <>
class _TypeTraits<unsigned long>
{
	typedef _TrueType __IsPODType;
};
template <>
class _TypeTraits<long>
{
	typedef _TrueType __IsPODType;
};
template <>
class _TypeTraits<long double>
{
	typedef _TrueType __IsPODType;
};
template <class _tp>
class _TypeTraits<_tp*>
{
	typedef _TrueType __IsPODType;
};

template <class T>
void Copy(T* dest, T* src, size_t size, _FalseType)
{
	cout << "__FalseType:" << typeid(T).name() << endl;
	size_t i = 0;
	for (; i < size; i++)
	{
		dest[i] = src[i];
	}
}
#include <memory.h>
template <class T>
void Copy(T* dest, T* src, size_t size, _TrueType)
{
	cout << "__TrueType:" << typeid(T).name() << endl;
	memcpy(dest, src, size);
}
#include "typetraits.h"
#include <stdlib.h>
void test()
{
	char a[] = { 1, 2, 3, 4 };
	char b[10];
	Copy(b, a, 4, _TypeTraits<char>::__IsPODType());

	string c[] = { "111", "222", "333", "444" };
	string d[10];
	Copy(d, c, 4, _TypeTraits<string>::__IsPODType());

}

int main()
{
	test();
	system("pause");
	return 0;
}

运行结果为:

模板--类型萃取

这样的代码是如何实现的呢?我们通过调用过程来看一看:

模板--类型萃取

上面的这张图可以一目了然的屡清楚整个过程。