1. 程式人生 > >確定class型別

確定class型別

功能:確定某個型別是否是class型別。

template<typename T>
class IsClassT
{
private:
	typedef char One;
	typedef struct { char a[2]; } Two;
	template<typename C> static One test(int C::*);
	template<typename C> static Two test(...);

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

上面程式碼利用了一個知識點:即只有是class型別時,成員指標型別C::*才有效。

#include <iostream>
#include "IsClassT.hpp"

using namespace std;

class MyClass{};
struct MyStruct{};
union MyUnion{};
void func() {}
enum E{e1} e;

template<typename T>
void check()
{
	if (IsClassT<T>::Yes)
	{
		cout << " IsClassT " << endl;
	}
	else
	{
		cout << " !IsClassT " << endl;
	}
}

//check T param
template<typename T>
void checkT(T)
{
	check<T>();
}

int main(int argc, char **argv)
{
	cout << "int: ";
	check<int>();

	cout << "MyClass: ";
	check<MyClass>();

	cout << "MyStruct: ";
	MyStruct s;
	checkT(s);

	cout << "MyUnion: ";
	check<MyUnion>();

	cout << "enum: ";
	checkT(e);

	cout << "function: ";
	checkT(func);

	return 0;
}

輸出結果:

int:  !IsClassT 
MyClass:  IsClassT 
MyStruct:  IsClassT 
MyUnion:  IsClassT 
enum:  !IsClassT 
function:  !IsClassT