Когда использовать CRTP вместо явного параметра объекта в С++ 23?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Когда использовать CRTP вместо явного параметра объекта в С++ 23?

Сообщение Anonymous »

Краткая версия вопроса
C++23 дает нам новый способ написания классов-примесей (вместо CRTP). Есть ли контекст, в котором CRTP по-прежнему будет предпочтительнее?
Краткое описание двух подходов
CRTP — это мощная идиома в C++, которая использует шаблоны для автоматического создания поведения, зависящего от типа, во время выполнения. Это часто используется для создания классов-примесей.

В C++23 представлены явные параметры объекта, которые позволяют явно ссылаться на имя класса в списках параметров нестатических функций-членов. В результате нестатические функции-члены шаблона могут получить доступ к производному классу, что устраняет необходимость специализировать примесь на производном классе.

Вот пример, иллюстрирующий старый и новый подход.

// классический CRTP (старый подход) шаблон класс MyMixin { // ... недействительный Фу() { // Что-то с использованием T... } }; // необходимо специализировать MyMixin вместо MyType класс MyType: public MyMixin { // ... }; // явный параметр объекта (подход C++23) класс MyMixin { // ... шаблон void foo(это T* self) { // Что-то с использованием T... } }; // лучший синтаксис для миксинов класс MyType: public MyMixin { // ... }; Очевидно, что новый подход приводит к более чистому синтаксису производного класса. Например, это позволяет нам избегать таких неприятных вещей:

template класс MyWackyContainer: public MyMixin поскольку при новом подходе нам не нужно предоставлять параметр шаблона для MyMixin.
Полный вопрос
Согласно аннотации этой статьи (в которой рассматривается ранее упомянутая проблема),

Хотя [добавление явных параметров объекта] устранило необходимость использования CRTP во многих местах, все еще существуют случаи, которые необходимо выражать с использованием этого шаблона.

Единственное функциональное различие, которое я мог придумать между CRTP и новым подходом, заключается в том, что CRTP позволяет нам ссылаться на тип при объявлении нефункциональных членов и статических функций-членов. Но есть ли ситуации, когда это действительно полезно?

(Вторичный вопрос: правильно ли я понял? Я что-то пропустил?)
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»