SFINAE原则初看是刺激的,写好之后是高效的,写错了就是既折磨编译器又折磨自己的。各种编译器对模板的支持程度又是不一样的,对待代码要有屈机精神,不然就只好向言不由衷的错误信息投降了。
先旨声明,调试这里的代码用vc2008会顺利很多,template就是把编译器的功能发挥到最大了,所以几行代码卡你十几秒乃寻常事,为了让程序够cool够rock,其余的,随它去。
so, check it out ...
template<typename T>
class IsClass
{
typedef char one;
typedef struct { char x[2]; }two;
template<typename T> static one test(int T::*);
template<typename T> static two test(...);
public:
enum { Yes = (sizeof(test<T>(0)) == sizeof(one)) };
enum { No = !Yes};
};
typedef char True;
typedef struct {char x[2];} False;
template<typename T> True IsPtr(T*);
False IsPtr(...);
#define ISPTR(f) (sizeof(IsPtr(f))==sizeof(True))
先旨声明,调试这里的代码用vc2008会顺利很多,template就是把编译器的功能发挥到最大了,所以几行代码卡你十几秒乃寻常事,为了让程序够cool够rock,其余的,随它去。
so, check it out ...
template<typename T>
class IsClass
{
typedef char one;
typedef struct { char x[2]; }two;
template<typename T> static one test(int T::*);
template<typename T> static two test(...);
public:
enum { Yes = (sizeof(test<T>(0)) == sizeof(one)) };
enum { No = !Yes};
};
typedef char True;
typedef struct {char x[2];} False;
template<typename T> True IsPtr(T*);
False IsPtr(...);
#define ISPTR(f) (sizeof(IsPtr(f))==sizeof(True))