На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Qraizer, Hsilgos
  
> Какой аспект проектирования решается?
    Буэнос диас, амигос!

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

    ExpandedWrap disabled
      #include <iostream>
       
      class S {};
       
      template<typename T>
      class A {};
       
      class B: public A<S> {};
       
      int main() {
        B b;
        return 0;
      }
      Скорее ты видишь подобные конструкции:
      ExpandedWrap disabled
        template<typename T>
        class Root
        {
        };
         
        class Derived : public Root<Derived>
        {
        };

      Это называется CRTP (Curiously recurring template pattern).
        Тоже об этом подумал.
        Первый пример просто сокращает A<S> до простого B, но в нём надо ещё заморочиться спец.методами. Других мотиваций так писать я что-то не вижу.
          Нормуль!!!
          В каких паттернах проектирования это привносит лучший профит?
            Наследование реализации без рантайм-полиморфизма.
              Ага .... Интересненько!!! Плюс тебе :lol:
                Цитата Flex Ferrum @
                Наследование реализации без рантайм-полиморфизма.
                На самом деле для этого CRTP не нужен, достаточно простого шаблонного параметра
                ExpandedWrap disabled
                  template <typename T>
                  class A
                  {
                    typename T::value_type member;
                   
                    void foo()
                    {
                      T::foo_impl();
                    }
                  /* ... */
                  };
                CRTP даёт больше чем просто статический молиморфизм, он предоставляет двустороннюю связь между базовым и производным классами: снизу вверх через унаследованные и/или перекрытые методы, сверху вниз через шаблонный параметр.
                  Qraizer, Flex Ferrum, "имя, сесЧра, имя ©" :lol:
                  В каких паттернах проектирования сей механизм уместен?

                  Добавлено
                  ЗЫ: За примеры - закидаю бестами и рагардами! 8-)
                    JoeUser, это сам по себе паттерн проектирования.
                    Вот, например, этот паттерн применяется для реализации Visitor'а:
                    https://github.com/flexferrum/cpp_tutorial/...lc/calculator.h
                    https://github.com/flexferrum/cpp_tutorial/..._visitor_base.h

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

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

                      Стопэ :lol: Я читаю уже который N-ый раз книженцию по паттернам проектирования (читаю многократно тупо по причине отсутствия практики). Но ... там есть два важных момента:
                      1) Название паттерна
                      2) Пример реализации
                      Посему. Если данный механизм не тянет на "звание" паттерна - давай просто перечислим его use case(s), и, для сравнения, худшие альтернативы.
                      Сообщение отредактировано: JoeUser -
                        С альтернативами просто - попробуй написать свой обобщенный Visitor. Потом сравни с тем, что у меня. :) CRTP - это чисто плюсовый паттерн. В книжках типа GoF ты его не найдёшь. Реализация проста (приведена выше). Юскейсы - везде, где может быть полезно, когда базовый класс знает детали реализации наследника.
                          Цитата Flex Ferrum @
                          CRTP - это чисто плюсовый паттерн.

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

                          Но речь не об этом. Есть "механизм", который претендует на "паттерн проектирования". Давай все ж его как-то опишем, обзовем? Быть может ты первым будешь? :)
                            Паттерны вполне могут зависеть и от языка, и от технологии. Это, в общем, нормально. :) Есть вещи, общие для всех. А есть те, которые принято применять при разработке с помощью конкретного инструментария. CRTP - одна из таких.
                              Flex Ferrum, э - нее ... погоди!
                              "Паттерны проектирования" - сиречь есть способы построения программы. Может ЯП или не может - это проблемы конкретного ЯП.
                              Пока вопрос простой - это нужно и востребовано? В каких паттернах проектирования это может быть востребованно на примере?
                                Так я же выше привёл конкретный пример использования для реализации visitor'а.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0500 ]   [ 16 queries used ]   [ Generated: 19.03.24, 08:32 GMT ]