您的位置:首页 > 其它

模板的使用:如何判断参数是否为一个类

2017-01-22 11:33 309 查看
一、需求引入

如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?

二、模板实现

template<typename T> 

class IsClassT { 

private: 

typedef char One; 

typedef struct {

 char a[2]; 

} Two; 

//如果C是类变量,调用这个

template<typename C> 

static One test(int C::*); 

//如果C是普通变量,调用这个

template<typename  C>  

static  Two  test(...);  

public: 

enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 }; 

enum { No = !Yes }; 

}

三、使用

class MyClass { }; 

struct MyStruct { }; 

 

union MyUnion { }; 

 

void myfunc() { } 

 

enum E { e1 } e;

第一种:把类型当做模板自变量(template argument)传进去检验 

template <typename T> 

void check() { 

if (IsClassT<T>::Yes) { 

std::cout << " IsClassT " << std::endl; 



else { 

std::cout << " !IsClassT " << std::endl; 



}

第二种:把类型当做函数调用自变量(function call argument)传进去检验 

template <typename T> 

void checkT (T) { 

check<T>();     //第一种中的模板函数



int main() { 

//第一种调用

std::cout << "int: "; 

check<int>(); 

std::cout << "MyClass: "; 

check<MyClass>(); 

//第二种调用 

std::cout << "MyStruct:"; 

MyStruct s; 

checkT(s);  

//第一种调用

std::cout << "MyUnion: "; 

check<MyUnion>(); 

//第二种调用

std::cout << "enum: "; 

checkT(e); 

std::cout << "myfunc():"; 

checkT(myfunc); 



 

 

程序输出如下: 

 

int:   !IsClassT 

MyClass:  IsClassT 

MyStruct: IsClassT 

MyUnion: IsClassT 

enum: !IsClassT 

myfunc(): !IsClassT 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐