Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Общие вопросы > Какой аспект проектирования решается?


Автор: JoeUser 16.03.18, 15:00
Буэнос диас, амигос!

Возник вопрос. Часто вижу подобные конструкции (ниже в коде). Но ни как не могу понять, к какому патерну проектирования это сопоставить, и как это вяжется в большей степени с принципами ООП. Вот примерный, синтетический код:

<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    #include <iostream>
     
    class S {};
     
    template<typename T>
    class A {};
     
    class B: public A<S> {};
     
    int main() {
      B b;
      return 0;
    }

Автор: Flex Ferrum 16.03.18, 15:21
Скорее ты видишь подобные конструкции:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    template<typename T>
    class Root
    {
    };
     
    class Derived : public Root<Derived>
    {
    };

Это называется CRTP (Curiously recurring template pattern).

Автор: Qraizer 16.03.18, 15:25
Тоже об этом подумал.
Первый пример просто сокращает A<S> до простого B, но в нём надо ещё заморочиться спец.методами. Других мотиваций так писать я что-то не вижу.

Автор: JoeUser 16.03.18, 15:25
Нормуль!!!
В каких паттернах проектирования это привносит лучший профит?

Автор: Flex Ferrum 16.03.18, 15:27
Наследование реализации без рантайм-полиморфизма.

Автор: JoeUser 16.03.18, 15:29
Ага .... Интересненько!!! Плюс тебе :lol:

Автор: Qraizer 16.03.18, 16:07
Цитата Flex Ferrum @
Наследование реализации без рантайм-полиморфизма.
На самом деле для этого CRTP не нужен, достаточно простого шаблонного параметра
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    template <typename T>
    class A
    {
      typename T::value_type member;
     
      void foo()
      {
        T::foo_impl();
      }
    /* ... */
    };
CRTP даёт больше чем просто статический молиморфизм, он предоставляет двустороннюю связь между базовым и производным классами: снизу вверх через унаследованные и/или перекрытые методы, сверху вниз через шаблонный параметр.

Автор: JoeUser 16.03.18, 16:24
Qraizer, Flex Ferrum, "имя, сесЧра, имя ©" :lol:
В каких паттернах проектирования сей механизм уместен?

Добавлено
ЗЫ: За примеры - закидаю бестами и рагардами! 8-)

Автор: Flex Ferrum 16.03.18, 16:36
JoeUser, это сам по себе паттерн проектирования.
Вот, например, этот паттерн применяется для реализации Visitor'а:
https://github.com/flexferrum/cpp_tutorial/...lc/calculator.h
https://github.com/flexferrum/cpp_tutorial/..._visitor_base.h

Как видишь, рантайм-полиморфизм здесь совмещен со статическим. При этом конкретные реализации методов-визиторов не виртуальные, а берутся базовым классом непосредственно из производного.

Добавлено
А вот класс, по которому производится диспетчеризация, полиморфный, да.

Автор: JoeUser 16.03.18, 16:44
Цитата Flex Ferrum @
JoeUser, это сам по себе паттерн проектирования.

Стопэ :lol: Я читаю уже который N-ый раз книженцию по паттернам проектирования (читаю многократно тупо по причине отсутствия практики). Но ... там есть два важных момента:
1) Название паттерна
2) Пример реализации
Посему. Если данный механизм не тянет на "звание" паттерна - давай просто перечислим его use case(s), и, для сравнения, худшие альтернативы.

Автор: Flex Ferrum 16.03.18, 16:49
С альтернативами просто - попробуй написать свой обобщенный Visitor. Потом сравни с тем, что у меня. :) CRTP - это чисто плюсовый паттерн. В книжках типа GoF ты его не найдёшь. Реализация проста (приведена выше). Юскейсы - везде, где может быть полезно, когда базовый класс знает детали реализации наследника.

Автор: JoeUser 16.03.18, 17:02
Цитата Flex Ferrum @
CRTP - это чисто плюсовый паттерн.

Хехехе ))) Странное утверждение!!!
Паттерны проектирования не зависят от языка программирования. Да, где-то (возможно) они не реализуемы, допускаю. Но чтобы "чисто С++" - сорри, не верю! Тот же Perl5 (в плане ООП) может все то, что и современный C++14/17, вангую с меньшими затратами тупо за счет динамического полиморфизма. А это что? Это == минус шаблонное программирование.

Но речь не об этом. Есть "механизм", который претендует на "паттерн проектирования". Давай все ж его как-то опишем, обзовем? Быть может ты первым будешь? :)

Автор: Flex Ferrum 16.03.18, 17:09
Паттерны вполне могут зависеть и от языка, и от технологии. Это, в общем, нормально. :) Есть вещи, общие для всех. А есть те, которые принято применять при разработке с помощью конкретного инструментария. CRTP - одна из таких.

Автор: JoeUser 16.03.18, 18:48
Flex Ferrum, э - нее ... погоди!
"Паттерны проектирования" - сиречь есть способы построения программы. Может ЯП или не может - это проблемы конкретного ЯП.
Пока вопрос простой - это нужно и востребовано? В каких паттернах проектирования это может быть востребованно на примере?

Автор: Flex Ferrum 16.03.18, 19:07
Так я же выше привёл конкретный пример использования для реализации visitor'а.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)