Как стать автором
Обновить

Комментарии 9

CRTP паттерн вовсе не экзотика, а совершенно необходимая вещь, сам часто им пользуюсь.

Когда увидел Win API, читать далее потерял интерес.
Почему же? Всегда интересно посмотреть как человек, приговаривая постоянно «это ни один нормальный разработчик в здравом уме в реальности ничего подобного использовать не будет» изобретает стандартную библиотеку для программирования под Windows.

Более интересно другое: вся статья — это описание хорошо известных эффектов из библиотек промышленной разработки под Windows.

Объяснение того, как вот это вот работает и для чего нужно:
template <class TBase = ATL::CWindow, class TWinTraits = ATL::CFrameWinTraits>
class ATL_NO_VTABLE CFrameWindowImplBase :
    public ATL::CWindowImplBaseT< TBase, TWinTraits >

И при этом рефреном идёт мысль «как это всё удивительно, ново и странно». И замечания, что «использовать это никак нельзя».

Возникает когнитивный диссонанс: автор вообще в курсе что именно он переизобрёл или нет? То есть: это сарказм и стёб или нет?

Потому что я вот совершенно не могу, исходя из текста, на этот вопрос ответить…

Да, CRTP превращает динамический полиморфизм в статический. И да, разумеется при этом динамический перестаёт действовать. Нормальное, стандартное поведение. Где новизна и какие-то странные «неведомые» проблемы, собственно???

Я, может быть, чего-то не понял?
Ну слава Богу, хоть кто-то рассказал, что у меня получилось и что это где-то реально используется!

«это ни один нормальный разработчик в здравом уме в реальности ничего подобного использовать не будет»
Вы не поверите, но мне действительно так казалось.

«template class ATL_NO_VTABLE CFrameWindowImplBase:
public ATL::CWindowImplBaseT< TBase, TWinTraits >»
Отлично! Значит, когда я таки доберусь до этой библиотеки, мне будет гораздо проще и продуктивнее её изучать.

«Возникает когнитивный диссонанс: автор вообще в курсе что именно он переизобрёл или нет?»
Наверное, был бы в курсе, статьи бы не было или она была бы написана в другом ключе.

«И да, разумеется при этом динамический перестаёт действовать. Нормальное, стандартное поведение. Где новизна и какие-то странные «неведомые» проблемы, собственно???»
Неведомые проблемы были не в динамическом полиморфизме, а в поведении указателей и преобразований типов. Вы, наверное, уже в конце статьи не обратили на это внимание.

«И при этом рефреном идёт мысль «как это всё удивительно, ново и странно». И замечания, что «использовать это никак нельзя».»
Для меня это была не более чем интересная задачка. То, что это действительно полезно и где-то используется, я не предполагал. И обсудить это было не с кем. Нельзя объять необъятное.

Но, вообще, Вы правы. В свете этих новых сведений статью стоило бы переписать по-другому или хотя бы обязательно упомянуть об ATL/WTL, а потом начать так: «я пришёл к этому таким образом...». Но лучше бы вообще сначала поглубже познакомиться с этими библиотеками, что для меня в данный момент затруднительно.
Ну… что сказать. Успехов вам. Просто вроде до термина CRTP вы всё-таки добрались, а там, прямо в статье в Wikipedia написано:

Реализация от Microsoft в ATL была открыта независимо Яном Фалкином (англ. Jan Falkin) также в 1995 году. Он случайно унаследовал базовый класс от класса наследника. Кристиан Бомон (англ. Christian Beaumont), заметив этот код, решил, что он не может быть скомпилирован, но, выяснив, что может, решил положить эту ошибку в основу ATL и WTL.

Так что посмотреть на ALT и WTL кажется естественным в свете проделанного вами…

А вообще — всё это достаточно стандартные, сегодня, техники, про них даже книжки есть. То что вы их сами переизобрели — это прекрасно, а вот что потом, не нашли ничего «по теме»… уже не так хорошо.
Спасибо.

Про CRTP узнал чисто случайно, и то не сразу.

«а вот что потом, не нашли ничего «по теме»… уже не так хорошо».
Да я и не искал особо, если честно. Я бы скорее начал искать, если бы что-то не получилось.

В любом случае, статья, наверное, может быть полезна в плане того, как делаются такие вещи. Потому что когда читаешь уже готовое, часто непонятно, как люди к этому пришли и в чём стояла исходная проблема. А это сильно влияет на понимание.

Спасибо. Книгу тоже посмотрю. :)

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

Поздравляю со вступлением в клуб любителей шаблонов.
Желаю дальнейших успехов ;) .

Спасибо! :)
Да я уже давно… Ещё 7 лет назад, когда делал свой менеджер потоков с учётом балансировки нагрузки на видеокартах. Там сделал свой аналог типа variant и аналог вызова функции наподобие std::function, но с ограниченным количеством параметров, потому что вариативных шаблонов тогда не было. Вернее, они были, но я про них ничего не знал. Тогда ещё и вошёл во вкус.:) Но этих менеджеров потоков… как собак… Потому всегда думал, что всем будет неинтересно про это читать.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории