命名空间
变体
操作

好奇递归模板模式

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
 

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)
允许一个对象创建一个指向自身的 shared_ptr
(类模板) [编辑]
用于定义 view 的辅助类模板,使用 好奇递归模板模式
(类模板) [编辑]