"奇怪的重复模板模式"的实际应用

Kev*_*vin 42 c++ templates design-patterns crtp f-bounded-polymorphism

" 奇怪的重复模板模式 "有哪些实际用途?通常显示的" 计数类 "示例对我来说并不是一个令人信服的例子.

moo*_*dow 21

模拟动态绑定.避免虚拟函数调用的成本同时保留一些分层优势是子系统的巨大胜利,它可以在我目前正在进行的项目中完成.

  • 我看不出它可以如何使用。多态性的工作原理是使用基类指针根据派生类的类型调用派生类方法。然而,在 CRTP 代码中,您仍然需要 template< typename returned > class base{ public: void impl(){ static_cast<衍生*>( this )->impl(); } }; 派生类 : public base<衍生> { void impl() { /* 某事 */ } }; 基<派生*> basePtr; 因此,您仍然必须在模板中提及派生类,这会破坏多态性,因为我必须显式声明派生类 (2认同)
  • 链接损坏。没有回答问题。 (2认同)

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类的情况.