Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Ага .... Интересненько!!! Плюс тебе |
Автор: Qraizer 16.03.18, 16:07 |
На самом деле для этого CRTP не нужен, достаточно простого шаблонного параметра <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> CRTP даёт больше чем просто статический молиморфизм, он предоставляет двустороннюю связь между базовым и производным классами: снизу вверх через унаследованные и/или перекрытые методы, сверху вниз через шаблонный параметр. template <typename T> class A { typename T::value_type member; void foo() { T::foo_impl(); } /* ... */ }; |
Автор: JoeUser 16.03.18, 16:24 |
Qraizer, Flex Ferrum, "имя, сесЧра, имя ©" В каких паттернах проектирования сей механизм уместен? Добавлено ЗЫ: За примеры - закидаю бестами и рагардами! |
Автор: 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 |
Стопэ Я читаю уже который N-ый раз книженцию по паттернам проектирования (читаю многократно тупо по причине отсутствия практики). Но ... там есть два важных момента: 1) Название паттерна 2) Пример реализации Посему. Если данный механизм не тянет на "звание" паттерна - давай просто перечислим его use case(s), и, для сравнения, худшие альтернативы. |
Автор: Flex Ferrum 16.03.18, 16:49 |
С альтернативами просто - попробуй написать свой обобщенный Visitor. Потом сравни с тем, что у меня. CRTP - это чисто плюсовый паттерн. В книжках типа GoF ты его не найдёшь. Реализация проста (приведена выше). Юскейсы - везде, где может быть полезно, когда базовый класс знает детали реализации наследника. |
Автор: JoeUser 16.03.18, 17:02 |
Хехехе ))) Странное утверждение!!! Паттерны проектирования не зависят от языка программирования. Да, где-то (возможно) они не реализуемы, допускаю. Но чтобы "чисто С++" - сорри, не верю! Тот же 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'а. |