Curiously Recurring Template Pattern
From cppreference.net
Curiously Recurring Template Pattern
— это идиома, в которой класс
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(); } : 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
, использующий
любопытно повторяющийся шаблонный паттерн
(шаблон класса) |
Внешние ссылки
| 1. | Заменить CRTP концепциями? — Блог Шандора Драго |
| 2. | Любопытный повторяющийся шаблонный паттерн (CRTP) — Блог Шандора Драго |
| 3. | Любопытный повторяющийся шаблонный паттерн (CRTP) - 1 — Fluent { C ++ } |
| 4. | Что CRTP может привнести в ваш код - 2 — Fluent { C ++ } |
| 5. | Вспомогательный класс для реализации CRTP - 3 — Fluent { C ++ } |
| 6. | Что такое Любопытный повторяющийся шаблонный паттерн (CRTP) — Stack Overflow |