Re[14]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 17:52
Оценка:
Здравствуйте, so5team, Вы писали:

S>Например, чтобы не читать больше про "сигнатуры шаблонных функций в C++".


Таки придется. Как бы Вам ни хотелось, шаблонные функции существуют, это выражение давно устоялось в литературе и документации. Соответственно, существуют и их сигнатуры.

S>Еще несколько лет назад я сам спокойно путал "шаблон функции" и "шаблонную функцию" и использовал эти два понятия как взаимозаменяемые. Пока мне не указали на разницу. С тех пор в моей вселенной в С++ "шаблонной функции" не существует.


Это высказывание просто прекрасно, оно похоже на "моя собака не кусала истца, она никогда не кусается, и вообще у меня нет никакой собаки".

Неужели Вы сами не видите здесь абсурдности?

— Вы считали два выражения равнозначными.
— Вам указали на то, что между ними есть разница.
— Вместо того, чтобы использовать каждое из них в соответствии со смыслом, Вы одно исключили полностью.

S>вы тут заняли позицию "ну попробуйте мне что-то новое о программировании рассказать, да я на C++ почти 30 лет программирую".


Вообще ни разу. Если Вы просмотрите историю, то увидите, что сведения о моем стаже программирование всплыли в тот момент, когда мне было заявлено "как можно программировать столько лет, и не знать самых азов". И получилось, что либо у меня совершенно уникальный опыт, в чем я сильно сомневаюсь, либо это таки не "самые азы", а достаточно специфическая (и потому редкая) ситуация.

S>когда человек изучает шаблоны в C++, то он должен был бы изучить и правила выбора шаблонов функций. Их там несколько и они не то, чтобы сильно замороченные, но я большинство из них забываю постоянно.


Такая же фигня. Я вообще многих формализмов не помню постоянно. Какие-то заметки делаю для себя, и периодически сверяюсь, в отдельных случаях ищу разъяснения или лезу в стандарт. Мне ж надо не экзамен сдавать, а писать работающий и эффективный код. Если компилятор не выдает ошибок, код делает то, что нужно, ничего лишнего в листингах не видно — на кой мне заморачиваться?

S>За исключением самого первого: обычные функции имеют приоритет перед шаблонами.


Возможно, в Вашей практике сочетания шаблонных и нешаблонных функций с одинаковыми наборами типов встречаются регулярно. Если мне за почти тридцать лет, после написания большого количества разнородного кода, это не встретилось ни разу — может, оно таки не является общеупотребительным? Ну, или Вам это просто в голову почему-то запало, тоже бывает.

S>Это вообще-то одна из базовых вещей в C++ со времен 98-го стандарта.


Да хоть одна из божьих заповедей, которых я с ходу тоже не перечислю. Повторяю: я исхожу из смысла, а не из формализма. А смысл в том, что подавляющее большинство функций имеет или разные имена (традиционно), или разные комбинации типов (перегрузки и шаблоны). Именно этим они и различаются, в этом и состоит смысл сигнатуры. А чтоб и то, и другое совпадало — это очень редкий, исключительный случай. Так на кой мне запоминать именно форму правила, а не его суть? Чтоб через тридцать лет она мне пригодилась впервые?

S>как можно программировать на C++ столько лет, да еще и шаблонами в C++ пользоваться, но не помнить одной из ключевых для шаблонов вещей.


Примерно так же, как много лет водить автомобиль, не помня (или даже вовсе не зная) рабочей температуры охлаждающей жидкости. Раньше, если помните, это должен был знать каждый, и указатель на панели был везде. Сейчас даже указателя в большинстве автомобилей нет.

S>Был код, в котором была реализация какой-то функции, скажем, concat. Реализована правильно, работала без нареканий. Появился C++98, к этому коду добавили библиотеку, в которой есть шаблон concat. Если бы приоритет отдали шаблонам функций, то при перекомпиляции вызов старой concat незаметно был бы заменен на вызов нового шаблона concat.


Если для той же комбинации типов параметров шаблон реализует в точности то же самое поведение — ничего страшного. Это значит, что так было сделано умышленно, и надобность в прежней функции пропала. А если от вызова concat ожидается новое поведение, а по факту она ведет себя по-старому, и компилятор об этом даже не предупреждает — как раз и получается плохой, негодный, кривой код.

А теперь смотрите, что получается: Вы, позиционируя себя знающим язык [значительно] лучше меня, не видите в таком явно опасном коде ничего плохого. Я, ни разу не претендуя на глубокое знание языка, такого кода никогда не допускал даже интуитивно (до того, как сподобился почитать разные guidelines). Вы по-прежнему уверены, что направление критики выбрано верно?

S>Ну вообще-то каждый должен, да. Хотя джуниорам в C++ простительно было бы. Мидлам уже нет.


Возможно, дело в том, что Вы оцениваете работу программиста, как наемного работника, который обязан показать формальное знание языка, ответив на вопросы по синтаксису, семантике, тонким моментам и т.п., выполнить тестовые задания, которые оцениваются не только по результатам работы кода, но и по самому коду, уметь понимать и применять корпоративный стиль и так далее. А я ни дня не работал программистом по найму, а квалификационных тестов/экзаменов вообще никогда не сдавал после вуза, а в вуз я поступал, чтоб получить диплом, ибо тогда без диплома инженерной работы не давали. Я отвечаю не за знание языка и не за вид кода, а за функциональность и работоспособность своих продуктов. Судя по тому, что мне продолжают за них платить даже при переизбытке на рынке знатоков языка, незнание отдельных тонких моментов не является обязательным для его (языка) успешного использования.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.