1、真正的按需编译
一般来说我们提到“类库”概念的概念马上就想到DLL,也就是运行时类库。这样写框架的话框架有多少代码DLL就有多大。据实验最新的MFC的程序只需要一个空的对话框,静态编译出来EXE大小就有1M。
而C++模板技术几乎相当于宏替换,代码的实现都直接写在头文件里,并且只有在真正调用时才会编译。这样使得ATL对SDK的封装是在源代码级别的,相当于用到什么才去拉一段代码贴上去。没有MFC那样庞大的设计结构,耦合性很低,编译出的代码也就很精练了。
2、编译期多态
和上面类似,使用C++模板可以实现编译期间基类对子类成员随便直接访问,而无需通过运行时虚函数,这在通常的面向对象编程思想中是反人类的。例如以下代码:
template<class T> class CWindow { public: void Create() { CreateWindow((T*)this->ClassName, ...) } }; class MyWindow : public CWindow<MyWindow> { public: MyWindow() : ClassName("My Window Class") { } char* ClassName; };
第一次看到这样的代码我觉得我就在想,卧槽面向对象不带这样搞的。。。
3、动态代码实现HWND映射到窗口类指针
很久以前我就在设计如何在C++中实现类成员函数的委托,这玩意最大的用处可能就是窗口子类化了,可以省去维护一个HWND到指针的映射表,后来就写了一个动态代码的方案将this指针填写到ECX中(lxf.me/217)。今天发现ATL在几十年前就用上这种方法了,并且实现得比我的更加优雅和类型安全,还顺便把x86、x64、ia64、arm、mips等众多构架的实现都写好了(有兴趣可阅读atlstdthunk.h)。
综上,微软大法好,*nix一生黑。