一个模板巧妙技术,语法技巧

一个模板巧妙技术,语法技巧

研究Boost前,想深入了解一下模板技术,找来一本书《C++ Template:The Complete Guide》研究。
里面有这样一个小技巧,判断一个类中是否有某种类形。下面是代码:(Win 2K+ VS2003)

#include  < iostream >

//  返回类型,大小分别为1、2
typedef  char  RT1;
typedef 
struct
{
    
char  a[ 2 ];
}
 RT2;

//  选择这个版本将返回char,大小为1
template < typename T >  RT1 test(typename T::X  const * )
{
    
int     dumy     =   0 ;
    dumy
++ ;
}


//  选择这个版本将返回char,大小为2
template < typename T >  RT2 test()
{
    
int     dumy     =   0 ;
    dumy
++ ;
}


//  依靠编译器自动选择test函数,然后依据返回类型判断是否含有X
template < typename T >
bool  type_has_member_type_X()
{
    
return  ( sizeof (test < T > ( 0 ))  ==   1 );
}


//  有X类型的类
class  HasX
{
public :
    
class  X
    
{
    }
;
}
;

//  无X类型的类
class  NonX
{
public :
    
class  Y
    
{
    }
;
}
;

int  _tmain( int  argc, _TCHAR *  argv[])
{
    
//  编译器选择重载函数策略:选择类型最匹配版本
    
//  倾向于把0转化为常量空指针,所以选择返回为RT1版本
     if (type_has_member_type_X < HasX > ())
    
{
        std::cout 
<<   " Has X "   <<  std::endl;
    }

    
else
    
{
        std::cout 
<<   " Non X "   <<  std::endl;
    }


    
//  没有T::X,所以选择返回为RT2版本
     if (type_has_member_type_X < NonX > ())
    
{
        std::cout 
<<   " Has X "   <<  std::endl;
    }

    
else
    
{
        std::cout 
<<   " Non X "   <<  std::endl;
    }

    
return   0 ;
}
输出结果:
Has X
Non X

你可能感兴趣的:(一个模板巧妙技术,语法技巧)