Spec-Zone.ru › C++

Идиома рекурсивного шаблона с любопытно повторяющимся параметром

Идиома рекурсивного шаблона с любопытно повторяющимся параметром — это идиома, в которой класс 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)
enable_shared_from_this
(C++11)
позволяет объекту создать shared_ptr, ссылающийся на него самого
(шаблон класса)
ranges::view_interface
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API