![]() |
#2
zhuxiaoneng2013-04-17 13:30
|

#include <iostream>
using namespace std;
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 MyClass
{
};
template <typename T>
void check()
{
if (IsClassT<T>::Yes) {
std::cout << " IsClassT " << std::endl;
}
else {
std::cout << " !IsClassT " << std::endl;
}
}
int main()
{
std::cout << "int: ";
check<int>();
std::cout << "MyClass: ";
check<MyClass>();
}
这个是书上的源代码,但是在vs2008下编译不通过。
将
enum { Yes = sizeof(IsClassT<T>::test<T>(0)) == 1 };
enum { No = !Yes };
改为:
static bool isClass()
{
return sizeof(IsClassT<T>::test<T>(0)) == 1;
}
可以顺利通过
1 请问这是为什么?
2 template<typename C> static One test(int C::*); 中参数的类型为
指向int 型的C 类的成员的指针
但是MyClass 中并没有int型的数据成员,为什么可以通过编译,并且顺利得到结果?
3 template<typename C> static One test(int C::*); 为什么需要写成模板函数?
改写成:static One test(int T::*); 为什么不行??
谢谢大家帮忙解答下!