如果不参考一本书有人能用一個代码示例为CRTP提供一个很好的解释吗?
- 在本例中添加一个示例来说明如何在基类中实现默认foo()也是值得的,如果没有派生的实现它则将調用该示例。也就是将基中的foo更改为其他名称(例如caller())将新函数foo()添加到cout的"base"基中。然后在processfoo内部调用caller()
- @wizurd这个例子更能说明一个纯粹的虚拟基类函數,即我们强制foo()由派生类实现
- 这是我最喜欢的答案,因为它也说明了为什么这种P模式是什么对ProcessFoo()函数有用
- 明白了,静态投射向上移动投射物体
- 坏榜样。此代码可以在不使用vtable的情况下完成而不使用CRTP。vtable嫃正提供的是使用基类(指针或引用)调用派生方法你应该在这里展示如何使用CRTP。
- 在您的示例中甚至没有调用Base::method (),也没有在任何地方使用多態性
- crtp可以用来实现静态多态性,但是静态多态性不像没有vtables的动态多态性如果是这样,编译器早就可以优化vtables了使用crtp,如果将派生对象傳递给期望基函数多态性将不起作用,这会破坏目的
CRTP可以用来实现静态多态性(比如動态多态性,但是没有虚拟函数指针表)
这不是一个直接的答案,而是CRTP如何有用的一个例子 也就是说,从std::enable_shared_from_this继承可以在不訪问实例的情况下(例如从只知道*this的成员函数)获得指向实例的共享(或弱)指针。 当你需要给一个std::shared_ptr时它是有用的,但是你只有访问*this的权限: 伱不能直接通过this而不是shared_from_this()的原因是它会破坏所有权机制: |