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

本文介绍了一种利用C++模板元编程技术来判断一个给定的变量是否为类变量的方法。通过定义特定的模板函数和枚举,可以在编译期就确定变量的类型属性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求引入

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


二、模板实现

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 



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值