Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.124.8] |
|
Сообщ.
#1
,
|
|
|
Буэнос диас, амигос!
Возник вопрос. Часто вижу подобные конструкции (ниже в коде). Но ни как не могу понять, к какому патерну проектирования это сопоставить, и как это вяжется в большей степени с принципами ООП. Вот примерный, синтетический код: #include <iostream> class S {}; template<typename T> class A {}; class B: public A<S> {}; int main() { B b; return 0; } |
Сообщ.
#2
,
|
|
|
Скорее ты видишь подобные конструкции:
template<typename T> class Root { }; class Derived : public Root<Derived> { }; Это называется CRTP (Curiously recurring template pattern). |
Сообщ.
#3
,
|
|
|
Тоже об этом подумал.
Первый пример просто сокращает A<S> до простого B, но в нём надо ещё заморочиться спец.методами. Других мотиваций так писать я что-то не вижу. |
Сообщ.
#4
,
|
|
|
Нормуль!!!
В каких паттернах проектирования это привносит лучший профит? |
Сообщ.
#5
,
|
|
|
Наследование реализации без рантайм-полиморфизма.
|
Сообщ.
#6
,
|
|
|
Ага .... Интересненько!!! Плюс тебе
|
Сообщ.
#7
,
|
|
|
Цитата Flex Ferrum @ На самом деле для этого CRTP не нужен, достаточно простого шаблонного параметраНаследование реализации без рантайм-полиморфизма. template <typename T> class A { typename T::value_type member; void foo() { T::foo_impl(); } /* ... */ }; |
Сообщ.
#8
,
|
|
|
Qraizer, Flex Ferrum, "имя, сесЧра, имя ©"
В каких паттернах проектирования сей механизм уместен? Добавлено ЗЫ: За примеры - закидаю бестами и рагардами! |
Сообщ.
#9
,
|
|
|
JoeUser, это сам по себе паттерн проектирования.
Вот, например, этот паттерн применяется для реализации Visitor'а: https://github.com/flexferrum/cpp_tutorial/...lc/calculator.h https://github.com/flexferrum/cpp_tutorial/..._visitor_base.h Как видишь, рантайм-полиморфизм здесь совмещен со статическим. При этом конкретные реализации методов-визиторов не виртуальные, а берутся базовым классом непосредственно из производного. Добавлено А вот класс, по которому производится диспетчеризация, полиморфный, да. |
Сообщ.
#10
,
|
|
|
Цитата Flex Ferrum @ JoeUser, это сам по себе паттерн проектирования. Стопэ Я читаю уже который N-ый раз книженцию по паттернам проектирования (читаю многократно тупо по причине отсутствия практики). Но ... там есть два важных момента: 1) Название паттерна 2) Пример реализации Посему. Если данный механизм не тянет на "звание" паттерна - давай просто перечислим его use case(s), и, для сравнения, худшие альтернативы. |
Сообщ.
#11
,
|
|
|
С альтернативами просто - попробуй написать свой обобщенный Visitor. Потом сравни с тем, что у меня. CRTP - это чисто плюсовый паттерн. В книжках типа GoF ты его не найдёшь. Реализация проста (приведена выше). Юскейсы - везде, где может быть полезно, когда базовый класс знает детали реализации наследника.
|
Сообщ.
#12
,
|
|
|
Цитата Flex Ferrum @ CRTP - это чисто плюсовый паттерн. Хехехе ))) Странное утверждение!!! Паттерны проектирования не зависят от языка программирования. Да, где-то (возможно) они не реализуемы, допускаю. Но чтобы "чисто С++" - сорри, не верю! Тот же Perl5 (в плане ООП) может все то, что и современный C++14/17, вангую с меньшими затратами тупо за счет динамического полиморфизма. А это что? Это == минус шаблонное программирование. Но речь не об этом. Есть "механизм", который претендует на "паттерн проектирования". Давай все ж его как-то опишем, обзовем? Быть может ты первым будешь? |
Сообщ.
#13
,
|
|
|
Паттерны вполне могут зависеть и от языка, и от технологии. Это, в общем, нормально. Есть вещи, общие для всех. А есть те, которые принято применять при разработке с помощью конкретного инструментария. CRTP - одна из таких.
|
Сообщ.
#14
,
|
|
|
Flex Ferrum, э - нее ... погоди!
"Паттерны проектирования" - сиречь есть способы построения программы. Может ЯП или не может - это проблемы конкретного ЯП. Пока вопрос простой - это нужно и востребовано? В каких паттернах проектирования это может быть востребованно на примере? |
Сообщ.
#15
,
|
|
|
Так я же выше привёл конкретный пример использования для реализации visitor'а.
|