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))
本文详细解析了SFINAE原则在模板元编程中的应用,通过使用vc2008进行调试,展示了如何高效地利用编译器功能。文章包括了模板元编程的基础知识、SFINAE原则的解释及其在实际代码中的实现,以及如何面对不同编译器的兼容性问题。读者将了解到如何编写既高效又易于维护的模板代码。
406

被折叠的 条评论
为什么被折叠?



