Шаблон с любопытно повторяющейся структурой
Шаблон с любопытно повторяющейся структурой — это идиома, в которой класс X наследуется от шаблона класса Y, принимающего параметр шаблона Z, где Y инстанцируется с Z = X. Например,
template<class Z>
class Y {};
class X : public Y<X> {};Пример
Шаблон с любопытно повторяющейся структурой может использоваться для реализации «полиморфизма во время компиляции», когда базовый класс предоставляет интерфейс, а производные классы реализуют этот интерфейс.
#include <cstdio>
#ifndef __cpp_explicit_this_parameter // Traditional syntax
template <class Derived>
struct Base { void name() { (static_cast<Derived*>(this))->impl(); } };
struct D1 : public Base<D1> { void impl() { std::puts("D1::impl()"); } };
struct D2 : public Base<D2> { void impl() { std::puts("D2::impl()"); } };
void test()
{
// Base<D1> b1; b1.name(); //undefined behavior
// Base<D2> b2; b2.name(); //undefined behavior
D1 d1; d1.name();
D2 d2; d2.name();
}
#else // C++23 alternative syntax; https://godbolt.org/z/s1o6qTMnP
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()"); } };
void test()
{
D1 d1; d1.name();
D2 d2; d2.name();
}
#endif
int main()
{
test();
}Вывод:
D1::impl() D2::impl()
См. также
|
(C++11) | позволяет объекту создать shared_ptr , ссылающийся на себя (шаблон класса) |
|
(C++20) | вспомогательный шаблон класса для определения view, используя шаблон с любопытно повторяющейся структурой (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/crtp