好奇递归模板模式
来自 cppreference.com
The 好奇递归模板模式 是一种 idiom,其中一个类 X
从一个类模板 Y
派生,并接受一个模板参数 Z
,其中 Y
被实例化为 Z = X。例如,
template<class Z> class Y {}; class X : public Y<X> {};
[编辑] 示例
CRTP 可用于实现“编译时多态性”,其中基类公开了一个接口,而派生类则实现了该接口。
运行此代码
#include <cstdio> #ifndef __cpp_explicit_this_parameter // Traditional syntax template <class Derived> struct Base { void name() { static_cast<Derived*>(this)->impl(); } protected: Base() = default; // prohibits the creation of Base objects, which is UB }; struct D1 : public Base<D1> { void impl() { std::puts("D1::impl()"); } }; struct D2 : public Base<D2> { void impl() { std::puts("D2::impl()"); } }; #else // C++23 deducing-this syntax struct Base { void name(this auto&& self) { self.impl(); } }; struct D1 : public Base { void impl() { std::puts("D1::impl()"); } }; struct D2 : public Base { void impl() { std::puts("D2::impl()"); } }; #endif int main() { D1 d1; d1.name(); D2 d2; d2.name(); }
输出
D1::impl() D2::impl()
[编辑] 另请参阅
显式对象成员函数(推断 this ) (C++23) | |
(C++11) |
允许一个对象创建一个指向自身的 shared_ptr (类模板) |
(C++20) |
用于定义 view 的辅助类模板,使用 好奇递归模板模式(类模板) |