一、需求引入
如果给你一个变量,该如何判断是一个普通变量还是一个类变量呢?
二、模板实现
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