moo*_*dow 21
模拟动态绑定.避免虚拟函数调用的成本同时保留一些分层优势是子系统的巨大胜利,它可以在我目前正在进行的项目中完成.
Ste*_*sop 20
它对mixins也特别有用(我指的是你继承的类提供功能)它们自己需要知道它们在什么类型上运行(因此需要是模板).
在Effective C++中,Scott Meyers提供了一个类模板NewHandlerSupport <T>作为示例.这包含一个静态方法来覆盖特定类的新处理程序(与std :: set_new_handler对默认运算符new的处理方式相同),以及使用处理程序的operator new.为了提供每类型处理程序,父类需要知道它所处理的类型,因此它需要是一个类模板.template参数是子类.
如果没有CRTP,你无法真正做到这一点,因为你需要单独实例化NewHandlerSupport模板,并使用一个单独的静态数据成员来存储当前的new_handler,每个使用它的类.
显然,整个示例非常非线程安全,但它说明了这一点.
迈耶斯认为,CRTP可能被认为是"为我而做".我会说任何mixin都是这种情况,而CRTP适用于需要mixin模板而不仅仅是mixin类的情况.