タイプ抽出

2640 ワード

C++ではtypeidでタイプ名を取得できます(組み込みタイプもカスタムタイプも可能です)が、この方法で取得した名前を変数の宣言にすることはできません.では、C++ではどのようにしてオブジェクトのタイプを認識しますか??組み込みタイプとカスタムタイプをタイプ抽出で区別できます.
たとえば、組み込みタイプはmemcopyとmemmoveの2つの方法でコピーできます.カスタムタイプまたはstringは、値を割り当てる方法でコピーします.これで効率がアップします.
タイプ抽出の方式:タイプ抽出はテンプレートに基づいて内蔵タイプとその他のタイプを区別し、主な原理は内蔵タイプをすべて特化してから区別する.
struct TrueType
{
       bool Get()
       {
              return true;
       }
};
struct FalseType
{
       bool Get()
       {
              return false;
       }
};
template
struct TypeTraits
{
       typedef FalseType IsPODType;      //        , IsPODType FalseType
};
//         
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};
template<>
struct TypeTraits
{
       typedef TrueType IsPODType;        //        IsPODType TrueType
};


template
void Copy(T* dest,T* src,int sz)
{
       if (TypeTraits::IsPODType().Get() == 1)//       
       {
              memmove(dest, src, sz*sizeof(T));           //  string        ,  string      
       }
       else         //        
       {
              for (int i = 0; i