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

Pzz>А C++ позволяет определить шаблонную функцию с некоторым именем и еще, отдельно, нешаблонную с тем же именем и с тем же набором параметров, который может быть у шаблонной функции?


Оказывается, позволяет. Не иначе, для каких-нибудь хитрых шаблонных побочек.

P.S. Добро пожаловать в клуб не знающих <i>азов</i> языка С++
Автор: rg45
Дата: 23.01.23
.
Отредактировано 23.01.2023 22:06 Евгений Музыченко . Предыдущая версия .
Re[3]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 23.01.23 22:12
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Оказывается, позволяет. Не иначе, для каких-нибудь хитрых шаблонных побочек.


Какое удивительное открытие. И тридцати лет не прошло.

Я бы не стал писать сообщение по такому пустяковому поводу, просто в этом твоем высказывании скрывается ответ на твой же вопрос
Автор: Евгений Музыченко
Дата: 24.01.23
, приходилось ли тебе писать объявления функций или нет.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: пффф  
Дата: 23.01.23 22:16
Оценка: 1 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

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


Просто назови это очередным костылем и успокойся


ЕМ>Только вот какой в этом может быть смысл? Разве только перекрыть ранее определенную нешаблонную функцию, но это ж получатся изрядные грабли.


Только наоборот — нешаблонная перекрывает шаблонную. Никаких граблей, все с этим живут 30+ лет
Re[6]: Для чего шаблонной функции нужна особая сигнатура?
От: пффф  
Дата: 23.01.23 22:20
Оценка:
Здравствуйте, rg45, Вы писали:

R>Умение объявить функцию — что уж может быть базовее. Умение находить педали газа и тормоза — навык примерно того же уровня. Так что аналогия — прямее некуда. А то, что ты сюда невпопад приплетаешь и другие понятия: сигнатуры, линковку, модули и пр. указывает на то, что ты не понимаешь ни первого, ни второго, ни третьего. И все это только усиливает впечатление. Это нужно какой-то специальный дар иметь — три десятка лет использовать язык и нифига о нем не знать вообще.


Это понятно — он 30 лет пилит один продукт, вот и всё. Программистом со стажем его сложно назвать
Re[3]: Для чего шаблонной функции нужна особая сигнатура?
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.23 22:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>P.S. Добро пожаловать в клуб не знающих <i>азов</i> языка С++
Автор: rg45
Дата: 23.01.23
.


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

Мои рабочие языки — это Си и Go.
Re[2]: Для чего шаблонной функции нужна особая сигнатура?
От: пффф  
Дата: 23.01.23 22:22
Оценка:
Здравствуйте, Pzz, Вы писали:

ЕМ>>Какой в этом может быть смысл? Чем функция с определенными типами параметров и результата, реализованная через шаблон, в плане линковки отличается от функции с теми же типами, но без шаблона?


Pzz>А C++ позволяет определить шаблонную функцию с некоторым именем и еще, отдельно, нешаблонную с тем же именем и с тем же набором параметров, который может быть у шаблонной функции?


Без проблем. А что тут удивительного?
Re[3]: Для чего шаблонной функции нужна особая сигнатура?
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.23 22:37
Оценка:
Здравствуйте, пффф, Вы писали:

Pzz>>А C++ позволяет определить шаблонную функцию с некоторым именем и еще, отдельно, нешаблонную с тем же именем и с тем же набором параметров, который может быть у шаблонной функции?


П>Без проблем. А что тут удивительного?


Я просто уточнил. Я не знаток этого языка.
Re[3]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 24.01.23 01:23
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>P.S. Добро пожаловать в клуб не знающих <i>азов</i> языка С++
Автор: rg45
Дата: 23.01.23
.


Так а он нигде и не заявляет о свомем многолетнем опыте в этой области. Ни с кем не спорит и не требует переделать язык под себя, как ты. У тебя же что ни тема, то стенания по поводу того, какой плохой инструмент разработки тебе достался. А ты бы познакомился с этим инструментом для начала, хоть мало-мальски, а потом бы спорил уже.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 24.01.2023 1:34 rg45 . Предыдущая версия . Еще …
Отредактировано 24.01.2023 1:33 rg45 . Предыдущая версия .
Отредактировано 24.01.2023 1:28 rg45 . Предыдущая версия .
Отредактировано 24.01.2023 1:27 rg45 . Предыдущая версия .
Отредактировано 24.01.2023 1:26 rg45 . Предыдущая версия .
Отредактировано 24.01.2023 1:25 rg45 . Предыдущая версия .
Отредактировано 24.01.2023 1:24 rg45 . Предыдущая версия .
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 24.01.23 05:23
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


ЕМ>Ну так здесь "шаблон функции" и становится "шаблонной функцией" — функцией, сгенерированной по шаблону. "Шаблонный текст" — это конкретный текст, написанный по шаблону текста, "шаблонное поведение" — тоже конкретное поведение, реализующее шаблон поведения, и т.п.


Шаблон функции -- это как шаблон для заготовки. Вы берете шаблон и по шаблону изготавливаете деталь, далее используется уже конкретная деталь, а не шаблон.

Шаблонная функция -- это функция, которая напрямую и используется, которая выполняет одни и те же "шаблонные" действия, но для разных аргументов.

Поэтому в C++ имея шаблон:
template<typename T, typename U> void f(T a, U b);

вы в результате раскрытия шаблона (в зависимости от типов T и U) можете получить как:
void f(T1 a, U1 b) { a.f(b); }

так и:
void f(T2 a, U2 b) { b.g(a); }

так и:
void f(T3 a, U3 b) { a.f(); b.g(); }

так и:
void f(T4, U4) {}

и т.д.

А вот шаблонная функция в языках с генериками какой была, такой и останется. Например (псевдокод):
void F<T, U>(T a, U b) where A : IHasFMethod { a.f(b); }


ЕМ>Только вот какой в этом может быть смысл?


Такой же, как в перегрузке вообще. Такой же, как и в наличии специализации для шаблонов.
Re[9]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 24.01.23 05:25
Оценка: 1 (1) +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Это нарушает в первую очередь принцип единообразия терминологии. Исходный англоязычный термин instantiate применяется и к классу ("шаблону" объекта), и к шаблону класса, и к шаблону функции. Использование разных терминов в русском, из которых один переведен адекватно, а другой тупо транслитерирован — явный косяк.


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

PS. Вот честно давно уже считал себя ярким подтверждением актуальности афоризма "старого пса новым трюкам не обучишь", но, думается, вы здесь можете дать мне приличную фору.
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 08:46
Оценка:
Здравствуйте, пффф, Вы писали:

П>он 30 лет пилит один продукт


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

Pzz>Мои рабочие языки — это Си и Go.


В чем выгода от использования чистого C по сравнению с разумным подмножеством C++?
Re[4]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 09:00
Оценка:
Здравствуйте, rg45, Вы писали:

R>У тебя же что ни тема, то стенания по поводу того, какой плохой инструмент разработки тебе достался.


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

R>ты бы познакомился с этим инструментом для начала, хоть мало-мальски


Уговорили — сегодня же начну изучать классы. Я про них что-то слышал — пора уже и познакомиться поближе.
Re[8]: Для чего шаблонной функции нужна особая сигнатура?
От: σ  
Дата: 24.01.23 09:22
Оценка: :)
П>>он 30 лет пилит один продукт

ЕМ>Нет.


Даже одного не пилит?
Отредактировано 24.01.2023 9:23 σ . Предыдущая версия .
Re[8]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 09:25
Оценка:
Здравствуйте, so5team, Вы писали:

S>Шаблон функции -- это как шаблон для заготовки. Вы берете шаблон и по шаблону изготавливаете деталь, далее используется уже конкретная деталь, а не шаблон.


Совершенно верно. И называются такие изделия "шаблонными": составленные по шаблону, по модели — строго держась ея, сделанный по шаблону, связанный, соотносящийся по значению с существительным "шаблон"

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


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

ЕМ>>Только вот какой в этом может быть смысл?


S>Такой же, как в перегрузке вообще. Такой же, как и в наличии специализации для шаблонов.


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

Вообще, все это выглядит очень забавно на фоне нападок на обычную перегрузку C++ — "как можно иметь функции с одинаковыми именами, но разным поведением?!".
Re[10]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 09:34
Оценка:
Здравствуйте, so5team, Вы писали:

S>давно уже считал себя ярким подтверждением актуальности афоризма "старого пса новым трюкам не обучишь"


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

Кстати, русским языком я пользуюсь уже больше пятидесяти лет, и гораздо чаще, чем C++, и когда-то делал это профессионально (писал заказные статьи для журналов), однако не сумею сделать синтаксический разбор более-менее сложного предложения, а уж типа спряжения не назову ни для одного глагола. И да, мне тоже не стыдно...
Re[9]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 24.01.23 09:45
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Шаблон функции -- это как шаблон для заготовки. Вы берете шаблон и по шаблону изготавливаете деталь, далее используется уже конкретная деталь, а не шаблон.


ЕМ>Совершенно верно.


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

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


ЕМ>То есть — конкретный результат раскрытия шаблона.


Нет. Посмотрите на приведенные мной примеры. В C++ вы можете иметь разные конкретные результаты применения шаблона функции. Т.е. разный код. Компилятор обрабатывает шаблон и делает функцию, далее результирующая функция делает конкретные действия.

Внутри шаблонной функции в языках с генериками код всегда будет одинаковый. Т.е. функция не меняется, она выполняет одни и те же действия по шаблону. Функция сразу делает конкретные действия. Отличаться могут лишь типы аргументов.

Впрочем, я не вижу предмета для дальнейшего спора. Тут как с "в лоб" и "по лбу": вроде бы одно и то же, но на практике есть существенная разница получить правый прямой точно "в лоб" или же его же по касательной "по лбу".

S>>Такой же, как в перегрузке вообще. Такой же, как и в наличии специализации для шаблонов.


ЕМ>И в перегрузке, и в специализации шаблона варианты отличаются друг от друга комбинацией типов


Бла-бла-бла. Это все херня и очень странно, что вы этого не видите не смотря на 40+ лет в программировании.

И перегрузка, и специализация шаблона -- суть инструменты для того, чтобы дать возможность программисту написать код наилучшим образом подходящий под определенный набор параметров.

Если эта задача наилучшим образом решается перегрузкой, то она решается перегрузкой. Если шаблонами -- то шаблонами (включая специализации для них).

ЕМ>Какую смысловую нагрузку это несет? Есть примеры осмысленного использования таких сочетаний, или эта возможность существует исключительно для выкручивания из искусственно усложненных ситуаций?


Достаточно вспомнить, что шаблоны в язык добавили сильно позже того, как язык стал мейнстримом. Так что одна из целей того, что у обычных функций есть приоритет над шаблонными, -- это обеспечение той же самой логики работы кода, который был написан до появления шаблонов, при переходе на более свежие версии языка.
Re[5]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 24.01.23 10:08
Оценка: 9 (1) :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Уговорили — сегодня же начну изучать классы. Я про них что-то слышал — пора уже и познакомиться поближе.


Ура, вот и на нашей улице праздник, теперь Евгений начнет писать на C с классами.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[10]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 24.01.23 10:45
Оценка:
Здравствуйте, so5team, Вы писали:

S>В C++ вы можете иметь разные конкретные результаты применения шаблона функции. Т.е. разный код.


Этот код привязан к общему шаблону, или нет? Функции, полученные в результате реализации/специализации шаблона, как-то связаны между собой, или они полностью независимы?

S>Внутри шаблонной функции в языках с генериками код всегда будет одинаковый.


Сравнение с другими языками имеет смысл лишь в плане философского обсуждения. Если Вы считаете, что термин "template function" неприменим к C++ — возражайте Страуструпу, Александреску, Майерсу и прочим корифеям, которые употребляют его регулярно.

S>Если эта задача наилучшим образом решается перегрузкой, то она решается перегрузкой. Если шаблонами -- то шаблонами (включая специализации для них).


Так какие же задачи наилучшим образом решаются именно сочетанием перегрузки и шаблона, где и перегруженные, и шаблонные функции полностью совпадают по типам параметров/результата? И для перегрузки, и для шаблона по отдельности есть множество характерных примеров. Есть примеры именно для данного их сочетания?

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


То есть, в этом нет никакого глубинного смысла или "наилучшего решения", и все сводится к банальному сохранению совместимости с очень старым кодом, который нет возможности модифицировать?
Re[11]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 24.01.23 11:16
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

S>>В C++ вы можете иметь разные конкретные результаты применения шаблона функции. Т.е. разный код.


ЕМ>Этот код привязан к общему шаблону, или нет? Функции, полученные в результате реализации/специализации шаблона, как-то связаны между собой, или они полностью независимы?


Сложение a и b удовлетворяют общему шаблону или нет? Реализации сложения a и b полностью независимы?

ЕМ>Сравнение с другими языками имеет смысл лишь в плане философского обсуждения.


Мне казалось, что донесение до вас разницы между "шаблоном функции" (ключевое слово "шаблон") и "шаблонной функцией" (ключевое слово "функция") -- это и есть философское обсуджение.

ЕМ>Так какие же задачи наилучшим образом решаются именно сочетанием перегрузки и шаблона, где и перегруженные, и шаблонные функции полностью совпадают по типам параметров/результата? И для перегрузки, и для шаблона по отдельности есть множество характерных примеров. Есть примеры именно для данного их сочетания?


Да хотя бы банальное упрятывание реализации какой-то тяжелой и объемной реализации в .cpp-файл.

ЕМ>То есть, в этом нет никакого глубинного смысла или "наилучшего решения", и все сводится к банальному сохранению совместимости с очень старым кодом, который нет возможности модифицировать?


А этого недостаточно?

Кроме того, здесь мы явно имеем ситуацию, когда приоритет нужно отдать либо одному (скажем, обычным функциям), либо другому (скажем, шаблонам). И какой бы выбор не был сделан, всегда найдется кто-то с бородой до пола, который заявит, а я в программировании 40 лет, никогда подобной фигни не видел и не понимаю, почему так, объясните мне!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.