版本1
注:编译器 vs2013.
test.h
#ifndef __TEST_H__
#define __TEST_H__
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
#endif
typetraits.h
#pragma once
struct __TrueType
{
};
struct __FalseType
{
};
template<typename T>
struct TypeTraits
{
typedef __FalseType IsPodType;
};
template<>
struct TypeTraits<int>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<double>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<char>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<unsigned int>
{
typedef __TrueType IsPodType;
};
template<class T>
struct TypeTraits<T*>
{
typedef __TrueType IsPodType;
};
template<class DATE>
struct TypeTraits<DATE>
{
typedef __TrueType IsPodType;
};
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
#include "typetraits.h"
template<typename T>
T* __copy(T* dst, T* src, size_t n, __TrueType)
{
return memcpy(dst,src,sizeof(T)*n)
}
template<typename T>
T* __copy(T* dst, T* src, size_t n, __FalseType)
{
for (size_t i = 0; i < n; i++)
{
dst[i] = src[i];
}
return dst;
}
template<typename T>
T* copy(T* dst,T* src,size_t n)
{
return __copy(dst, src, n, TypeTraits<T>::IsPodType());
}
版本2
简单实用。。
test.h
#ifndef __TEST_H__
#define __TEST_H__
#include<iostream>
#include<string>
#include<stdlib.h>
using namespace std;
#endif
typetraits.h
#pragma once
struct __TrueType
{
bool Get()
{
return true;
}
};
struct __FalseType
{
bool Get()
{
return false;
}
};
template<typename T>
struct TypeTraits
{
typedef __FalseType IsPodType;
};
template<>
struct TypeTraits<int>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<double>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<char>
{
typedef __TrueType IsPodType;
};
template<>
struct TypeTraits<unsigned int>
{
typedef __TrueType IsPodType;
};
template<class T>
struct TypeTraits<T*>
{
typedef __TrueType IsPodType;
};
template<class DATE>
struct TypeTraits<DATE>
{
typedef __TrueType IsPodType;
};
#define _CRT_SECURE_NO_WARNINGS 1
#include "test.h"
#include "typetraits.h"
template<typename T>
template<typename T>
T* copy(T* dst, T* src, size_t n)
{
if (TypeTraits<T>::IsPodType().Get())
{
memcpy(dst, src, sizeof(T)*n);
}
else
{
for (size_t i = 0; i < n; i++)
{
dst[i] = src[i];
}
}
retyurn dst;
}