64,654
社区成员
发帖
与我相关
我的任务
分享
// traits/isclasst.hpp
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 };
};
//traits/isclasst.cpp
#include "isclasst.hpp"
#include <iostream>
using namespace std;
class MyClass
{
};
struct MyStruct
{
};
union MyUnion
{
};
void myfunc()
{
}
enum E { e1 } e;
// Check by passing type as template argument
template <typename T>
void check()
{
if (IsClassT<T>::Yes)
{
cout << " IsClassT " << endl;
}
else
{
cout << " !IsClassT " << endl;
}
}
// Check by passing type as function call argument
template <typename T>
void checkT(T)
{
check<T>();
}
int main()
{
cout << "int: ";
check<int>();
cout << "MyClass: ";
check<MyClass>();
cout << "MyStruct: ";
MyStruct s;
checkT(s);
cout << "MyUnion: ";
check<MyUnion>();
cout << "enum: ";
checkT(e);
cout << "myfunc(): ";
checkT(myfunc);
}
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(test<T>(0)) == 1 };
enum { No = !Yes };
};