Substitution Failure Is Not An Error

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))

你可能感兴趣的:(Substitution Failure Is Not An Error)