Идиома рекурсивного шаблона с любопытно повторяющимся параметром
Идиома рекурсивного шаблона с любопытно повторяющимся параметром — это идиома, в которой класс 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 с использованием идиомы рекурсивного шаблона с любопытно повторяющимся параметром (шаблон класса) |
Внешние ссылки
| 1. | Заменить CRTP концептами? — блог Шандора Драго |
| 2. | Идиома рекурсивного шаблона с любопытно повторяющимся параметром (CRTP) — блог Шандора Драго |
| 3. | Идиома рекурсивного шаблона с любопытно повторяющимся параметром (CRTP) — 1 — Fluent{C++} |
| 4. | Что CRTP может привнести в ваш код — 2 — Fluent{C++} |
| 5. | Вспомогательная реализация для CRTP — 3 — Fluent{C++} |
| 6. | Что такое идиома рекурсивного шаблона с любопытно повторяющимся параметром (CRTP)? — SO |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/language/crtp