类型萃取

C++怎么识别一个对象的类型?
typeid 可以获取到一个类型的名称,但是不能拿来做变量的声明。

POD类型萃取

注:POD(plain old data)平凡类型(无关痛痒的类型)–基本类型,指在C++中与C兼容的类型,可以按照C的方式处理。

#pragma once

//类型萃取代码

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

template<class T>
struct TypeTraits
{
    typedef  __FalseType _IsPODType;//默认为非内置类型
};
//模板的特化
template<>
struct TypeTraits<int>
{
    typedef __TrueType _IsPODType; //(内置类型的数据又称无关痛痒的类型)
};

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

template<>
struct TypeTraits<unsigned short>
{
    typedef __TrueType _IsPODType;
};

template<>
struct TypeTraits<short>
{
    typedef __TrueType _IsPODType;
};

template<>
struct TypeTraits<char>
{
    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<double>
{
    typedef __TrueType _IsPODType;
};

template<>
struct TypeTraits<long double>
{
    typedef __TrueType _IsPODType;
};

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

template<>
struct TypeTraits<bool>
{
    typedef __TrueType _IsPODType;
};



template<class T>
struct TypeTraits
{
    typedef __TrueType _IsPODType;
};

template<class T>
struct TypeTraits
{
    typedef __TrueType _IsPODType;
};

//使用参数推导的萃取处理
template<class T>
void Copy(const T* src, T* dst, size_t size, __FalseType)
{
    //非内置类型的拷贝
    cout << "__FalseType:" << typeid(T).name() << endl;
    for (size_t i = 0; i < size; ++i)
    {
        dst[i] = src[i];
    }
}

template<class T>
void Copy(const T* src, T* dst, size_t size, __TrueType)
{
    //内置类型的拷贝
    cout << "__TrueType:" << typeid(T).name() << endl;
    memcpy(dst,src,size*sizeof(T));
}

//使用萃取判断类型的Get函数判断是否是POD类型来处理
template<class T>
void Copy(const T* src, T* dst, size_t size)
{

    if (TypeTraits::_IsPODType().Get())
    {
        cout << "__TrueType:" << typeid(T).name() << endl;
        memcpy(dst, src, size*sizeof(T));
    }
    else
    {
        cout << "__FalseType:" << typeid(T).name() << endl;
        for (size_t i = 0; i < size; i++)
        {
            dst[i] = src[i];
        }
    }
}

void Test()
{
    string s1[10] = { "1", "2", "3", "4444444444444444444444444444" };
    string s2[10] = { "11", "22", "33" };
    Copy(s1, s2, 10, TypeTraits<string>::_IsPODType());
    Copy(s1, s2, 10);

    int a1[10] = { 1, 2, 3 };
    int a2[10] = { 0 };
    Copy(a1, a2, 10, TypeTraits<int>::_IsPODType());
    Copy(a1, a2, 10);
}
#define _CRT_SECURE_NO_WARNINGS 1
#include
using namespace std;
#include"TypeTraits.h"

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

类型萃取_第1张图片

类型萃取的实例运用

  1. SeqList(顺序表)
  2. 统一内存管理项目
  3. STL
  4. share_ptr(智能指针)

你可能感兴趣的:(C++)