Краткая версия вопроса
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 позволяет нам ссылаться на тип при объявлении нефункциональных членов и статических функций-членов. Но есть ли ситуации, когда это действительно полезно?
(Вторичный вопрос: правильно ли я понял? Я что-то пропустил?)
Когда использовать CRTP вместо явного параметра объекта в С++ 23? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение