確定class型別
阿新 • • 發佈:2018-11-07
功能:確定某個型別是否是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