Size: a a a

2020 November 25

CD

Constantine Drozdov in pro.cxx
Андрей Руссков
кхм кхм ranges кхм кхм
кстати, я тебе не затирал идею metalift?
у нас есть концепт и мы хотим записать требование коммутативности сложения
делаем операцию metalift которая переходит от типа к символьным аргументам и что-то вроде
metalift(a)::symbol<0>() + metalift(b)::symbol<1>() == metalift(b)::symbol<1>() + metalift(a)::symbol<0>()
источник

АР

Андрей Руссков... in pro.cxx
нюанс в том, что в большинстве практического кода дополнительное быстродействие от использования статического полиморфизма через шаблоны куда менее значимо, чем дополнительная когнитивная нагрузка. Это относительно старых добрых виртуальных функций
источник

m

magras in pro.cxx
Андрей Руссков
нюанс в том, что в большинстве практического кода дополнительное быстродействие от использования статического полиморфизма через шаблоны куда менее значимо, чем дополнительная когнитивная нагрузка. Это относительно старых добрых виртуальных функций
Так проблема паттерна виртуальный метод в том, что его невозможно читать. На мой взгляд у него когнитивная сложность выше любого другого решения. Даже crtp.
источник

PK

Pavel Kazakov in pro.cxx
Андрей Руссков
нюанс в том, что в большинстве практического кода дополнительное быстродействие от использования статического полиморфизма через шаблоны куда менее значимо, чем дополнительная когнитивная нагрузка. Это относительно старых добрых виртуальных функций
ну, если правильно всё написано, то тебе не придется лезть в кишки и смотреть как что-то сделано :) подвох в слове "если"
источник

АР

Андрей Руссков... in pro.cxx
magras
Так проблема паттерна виртуальный метод в том, что его невозможно читать. На мой взгляд у него когнитивная сложность выше любого другого решения. Даже crtp.
в случае с виртуальными функциями, IDE умеет находить все перегрузки и использования базовой функции. В случае с шаблонами ты не можешь положиться ни на что кроме ожиданий к архитектуре и строкового поиска по коду.

И эти ожидания почти никогда не оправдываются
источник

PK

Pavel Kazakov in pro.cxx
но мне, субъективно, больше виртуальные функции нравится читать, чем с crtp разбираться под час
источник

АР

Андрей Руссков... in pro.cxx
в обоих случаях я вычислил такой прикольный трюк: в интересующем месте печатаем стектрейс и из него мы знаем какая перегрузка где вызывается )
источник

m

magras in pro.cxx
Андрей Руссков
в обоих случаях я вычислил такой прикольный трюк: в интересующем месте печатаем стектрейс и из него мы знаем какая перегрузка где вызывается )
Виртуальный метод это не всегда одна точка кастомизации. Мне кажется я чаще видел сразу россыпь точек кастомизации, каждая из которых может быть переопределена на разном уровне иерархии наследования.
источник

m

magras in pro.cxx
Но возможно мне просто попадались худшие из возможных реализаций. Более того в том случае который я помню, вообще не нужны были подобные механизмы. Нужно было просто разделить иерархию наследования на две, потому что она очень неуклюже пытался решать сразу две слабо связанных задачи.
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Да, это оно. Плохо то, что для того чтобы прочитать такой метод надо облазить всю иерархию классов и собрать его по кускам.
Гнать на template method это как гнать на передачу компаратора в std::sort
источник

ПК

Побитый Кирпич... in pro.cxx
Та же херня по сути
источник

m

magras in pro.cxx
Побитый Кирпич
Та же херня по сути
У них есть принципиальная разница. Передача параметра явная, в то время как template method - это неявная передача управления непонятно куда.
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Гнать на template method это как гнать на передачу компаратора в std::sort
Ниет, само по себе наличие двух последовательных виртуальных вызовов на одном объекте означает подозрение на ошибку логики
источник

ПК

Побитый Кирпич... in pro.cxx
magras
У них есть принципиальная разница. Передача параметра явная, в то время как template method - это неявная передача управления непонятно куда.
1)Ты смотришь реализацию метода - видишь, что там вызывается виртуальный метод do_some1(). Куда он конкретно идёт ты в этом месте не знаешь.
2)Ты смотришь реализацию std::sort, видишь что там вызывается компаратор. Куда он конкретно идёт ты в этом месте не знаешь
источник

ПК

Побитый Кирпич... in pro.cxx
Constantine Drozdov
Ниет, само по себе наличие двух последовательных виртуальных вызовов на одном объекте означает подозрение на ошибку логики
Неочевидное утверждение - требует доказательств
источник

CD

Constantine Drozdov in pro.cxx
Побитый Кирпич
Неочевидное утверждение - требует доказательств
Твоя программа последовательно выяснила динамический тип, забыла его и снова выяснила
источник

CD

Constantine Drozdov in pro.cxx
Более того, есть логическое требование, что результаты запроса динамического типа - одинаковые
источник

m

magras in pro.cxx
Побитый Кирпич
1)Ты смотришь реализацию метода - видишь, что там вызывается виртуальный метод do_some1(). Куда он конкретно идёт ты в этом месте не знаешь.
2)Ты смотришь реализацию std::sort, видишь что там вызывается компаратор. Куда он конкретно идёт ты в этом месте не знаешь
Чаще в начале смотрят на место вызова только потом смотрят реализацию.
источник

AZ

Alexander Zaitsev in pro.cxx
в нормальных ситуациях реализацию вообще не смотрят :)
источник

ПК

Побитый Кирпич... in pro.cxx
magras
Чаще в начале смотрят на место вызова только потом смотрят реализацию.
Дак а во внешнем контексте тебе и конкретный тип может быть известен (так же как может быть НЕизвестен конкретный компаратор, который потом перейдет в std::sort).
источник