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

σ>
template<typename T, typename U> void f(T, U); // 1
template<typename U, typename T> void f(T, U); // 2


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

σ>«function template» и «templated function» это-таки не одно и то же


Ну так и я ж говорю о сигнатуре шаблонной функции, а не самого шаблона этой функции.
Re[5]: Для чего шаблонной функции нужна особая сигнатура?
От: Videoman Россия https://hts.tv/
Дата: 23.01.23 10:57
Оценка:
Здравствуйте, so5team, Вы писали:

S>Его волнует проблема линковки:

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

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

Сложно понять, что он хочет, поэтому даю всю релевантную инфу, не жалко, вдруг поможет .
Проблема линковки этих функций, это уже следствие. А выбрасывание-невыбрасывание, могут быть, могут не быть, зависит от линкера. Все оптимизации уже после происходят.
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: σ  
Дата: 23.01.23 11:00
Оценка:
σ>>«function template» и «templated function» это-таки не одно и то же

ЕМ>Ну так и я ж говорю о сигнатуре шаблонной функции, а не самого шаблона этой функции.


Чо? Возьми определения signature из https://timsong-cpp.github.io/cppwp/n4659/intro.defs и покажи, про что ты
Re[5]: Для чего шаблонной функции нужна особая сигнатура?
От: σ  
Дата: 23.01.23 11:10
Оценка: +4
ЕМ>σ>
template<typename T, typename U> void f(T, U); // 1
template<typename U, typename T> void f(T, U); // 2

ЕМ>Хм, разве компилятор не считает это одним шаблоном

Хм, нет

ЕМ> с [возможно] различными специализациями?


Чо?
Re[5]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 23.01.23 11:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


ЕМ>Да, в целом Ваше предположение верно — я хочу оставить в заголовке только перегруженные объявления, а шаблон спрятать в файл реализации (.cpp), поскольку так проще всего ограничить количество возможных вариантов, и не нарушать совместимости с другими библиотеками.


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

ЕМ>Увы, меня всегда раздражает стремление свести обсуждение понятий и смыслов к обмену формулами или фрагментами кода, если речи не идет о синтаксисе, особенностях семантики и подобных вещах, где код является ключевым.


Проблема в том, что вы используете формулировки, которые запросто можно трактовать по разному. И об этом вам только за последние 3-4 дня человек пять сказало.

S>>в моей вселенной нет сигнатуры "шаблонной функции", как и нет такой штуки, как "шаблонная функция". А есть "шаблон функции"


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


S>>не функция, а некий шаблон


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


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

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

S>>если нет функции, то нет и сигнатуры.


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


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

Вас же не удивляет то, что
void f(int, int);
void f(long, long);

получают в итоге разные сигнатуры.
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: so5team https://stiffstream.com
Дата: 23.01.23 11:26
Оценка: 6 (1)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Если нет, то какое это имеет значение для заданного вопроса?


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

S>>"Инстанцииорование" и "специализация" -- это вполне себе конкретные понятия, которые обозначают конкретные вещи. Часть общего словаря, на котором С++ разработчики доносят свои идеи до коллег. Использование устоявшихся терминов устраняет неоднозначности в толкованиях.


ЕМ>Так есть же устоявшийся термин — "создание экземпляра".


Создание экземпляра прежде всего ассоциируется во с этим:
struct demo {...};

demo obj; // Создали экземпляр.
demo * d = new demo; // И здесь создали экземпляр.


В случае с шаблонами принято говорить об инстанциировании шаблона.

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

ЕМ>Это обычно делается за счет того же механизма, который выбрасывает одинаковые константы (строки, GUID'ы/UUID'ы и т.п.), отдельных средств для этого не требуется. У MS для этого создается COMDAT.


Я понятия не имею как именно работают линкеры и какой именно формат у объектников, но здравый смысл подсказывает, что если у нас есть N объектников с дублями кода шаблона функции, то следует решить две проблемы:

a) как выбросить лишние дубли дабы они не раздували итоговый бинарник;
b) как поправить ссылки в коде на вызовы шаблона функций после того, как повыбрасывали дубли.

Соответственно, если у нас template<T>void f(T) для int превращается (условно) в __f_t_T_int, а void f(int) (условно) в __f_i, то мы легко можем понять где в коде нужно поменять ссылки на код шаблонной f (ищем вызовы __f_t_T_int), но не трогать ссылки на код нешаблонной f.

Если бы места вызова template<T> void f(T) для int не отличались бы от мест вызова void f(int), то как решать вторую проблему?
Re: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 23.01.23 18:09
Оценка: 9 (1) +2
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Хотел в одной из библиотек сделать финт ушами: в заголовке оставить объявления нескольких одноименных функций с перегрузкой типов параметров, а в модуле реализовать их общим шаблоном, явно определив версии с допустимыми комбинациями параметров. По замыслу, это позволило бы линковать с ней другие библиотеки без перекомпиляции их исходников. Но оказалось, что [как минимум] VC++ дает шаблонным функциям сигнатуры, отличные от сигнатур обычных функций, и линковки таки не получается.




Какие сигнатуры дает функциям VC++ — это его личное дело, какие хочет, такие и дает. А то, что делаешь ты — это в заголовочном файле объявляешь одни функции, а в "модуле" другие. И эти последние, конечно же, не видны за пределами единицы трансляции, поскольку нигде больше не объявлены. Ты можешь вынести свои шаблонные функции в тот же заголовок и это будут просто отдельные функции. И все вместе они будут подчиняться правилам Overload resolution.

C++ предоставляет тебе возможность объявить/определить две функции, у которых будут одинаковые имена, количество и типы формальных параметров и типы возвращаемого значения — одну шаблонную, а другую нешаблонную, и только в этом будет их различие. Можно показать на примере семейства функций округления с различными методами:

http://coliru.stacked-crooked.com/a/20a19418d9506072

enum class RoundMethod
{
    Down,
    Up,
    Nearest,
    Default = Nearest
};

template<RoundMethod = RoundMethod::Default>
double Round(double);

double Round(double v) { return Round<>(v); }


И тогда будут одновременно доступны такие, например, формы вызова как Round(3.14), Round<>(3.14) и Round<RoundMethod::Default>(3.14). И при этом будут вызываться разные функции. Более того, одни из них могут вызывать другие!

Сколько времени, ты говоришь, программируешь на C++ — 42 года или 43? Очень странно, что приходится объяснять тебе такие азы.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 23.01.2023 19:07 rg45 . Предыдущая версия . Еще …
Отредактировано 23.01.2023 18:54 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 18:52 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 18:52 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 18:51 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 18:24 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 18:22 rg45 . Предыдущая версия .
Re[2]: Для чего шаблонной функции нужна особая сигнатура?
От: σ  
Дата: 23.01.23 19:00
Оценка: +1 -1 :)
R>Сколько времени, ты говоришь, программируешь на C++ — 42 года или 43? Очень странно, что приходится объяснять тебе такие азы.
Прост уже деменция.
Re[8]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 19:07
Оценка:
Здравствуйте, σ, Вы писали:

ЕМ>>Ну так и я ж говорю о сигнатуре шаблонной функции, а не самого шаблона этой функции.


σ>Возьми определения signature из https://timsong-cpp.github.io/cppwp/n4659/intro.defs и покажи, про что ты


Я про function template specialization. С каким другим определением сигнатуры его можно спутать?
Re[6]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 19:22
Оценка:
Здравствуйте, so5team, Вы писали:

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


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

S>Шаблонная функция лучше подходит к языкам вроде Java и C#, в которых обобщенное программирование реализовано через генерики. Там код шаблонной функции можно скомпилировать однажды (даже без актуальных параметров), а затем использовать этот скомпилированный код при вызове функции с разными типами параметров.


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

S>Вас же не удивляет то, что

S>
S>void f(int, int);
S>void f(long, long);
S>

S>получают в итоге разные сигнатуры.

Это как раз не удивляет. А вот о том, что можно смешивать шаблонные и нешаблонные функции с одинаковыми наборами типов, я давно и прочно забыл, поскольку никогда этим не пользовался. Только вот какой в этом может быть смысл? Разве только перекрыть ранее определенную нешаблонную функцию, но это ж получатся изрядные грабли.
Re[8]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 19:27
Оценка: -1
Здравствуйте, so5team, Вы писали:

S>Создание экземпляра прежде всего ассоциируется во с этим:

S>
S>demo * d = new demo; // И здесь создали экземпляр.
S>


S>В случае с шаблонами принято говорить об инстанциировании шаблона.


Это нарушает в первую очередь принцип единообразия терминологии. Исходный англоязычный термин instantiate применяется и к классу ("шаблону" объекта), и к шаблону класса, и к шаблону функции. Использование разных терминов в русском, из которых один переведен адекватно, а другой тупо транслитерирован — явный косяк.
Re[2]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 19:31
Оценка: :)
Здравствуйте, rg45, Вы писали:

R>Сколько времени, ты говоришь, программируешь на C++ — 42 года или 43?


28.

R>Очень странно, что приходится объяснять тебе такие азы.


Ничего странного. Я ж на C++ программирую, а не сдаю по нему экзамены или прохожу собеседования. Поэтому хорошо помню лишь то, чем пользуюсь, а задачи пользоваться всеми возможностями языка лишь для того, чтобы это продемонстрировать, у меня никогда не было. Сомневаюсь, что в обозримое время сумею с пользой применить возможность определить одновременно и шаблонную, и нешаблонную функцию с одинаковым набором типов.
Re[3]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 23.01.23 19:42
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Ничего странного. Я ж на C++ программирую, а не сдаю по нему экзамены или прохожу собеседования. Поэтому хорошо помню лишь то, чем пользуюсь, а задачи пользоваться всеми возможностями языка лишь для того, чтобы это продемонстрировать, у меня никогда не было. Сомневаюсь, что в обозримое время сумею с пользой применить возможность определить одновременно и шаблонную, и нешаблонную функцию с одинаковым набором типов.


Звучит примерно как: "Я ж машину вожу, а не сдаю экзамен по вождению. Поэтому помнить где педаль газа, а где тормоза мне не обязательно". Как можно после 28 лет использования языка не понимать его базовых принципов, это мне сложно постичь.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 20:41
Оценка:
Здравствуйте, rg45, Вы писали:

R>Звучит примерно как: "Я ж машину вожу, а не сдаю экзамен по вождению. Поэтому помнить где педаль газа, а где тормоза мне не обязательно".


Боюсь, более корявую аналогию придумать уже невозможно.

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

Во-вторых, большинство профессиональных водителей знает формальные правила движения гораздо хуже, чем я — C++.

В-третьих, ежели Вас сейчас подвергнуть экзамену на знание всех тонкостей ПДД, то вряд ли Вы осилите сдать даже простенькие ПДД РФ, которые умещаются в тонкую книжицу, не говоря уже о каком-нибудь французском талмуде Code de Route, которого полностью, подозреваю, не знает вообще никто.

R>Как можно после 28 лет использования языка не понимать его базовых принципов


Элементарно, ибо это не "базовые принципы". Тем более, что я все эти годы успешно обходился без них.
Re[5]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 23.01.23 20:51
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Боюсь, более корявую аналогию придумать уже невозможно.

ЕМ>...
ЕМ>Элементарно, ибо это не "базовые принципы". Тем более, что я все эти годы успешно обходился без них.

Умение объявить функцию — что уж может быть базовее. Умение находить педали газа и тормоза — навык примерно того же уровня. Так что аналогия — прямее некуда. А то, что ты сюда невпопад приплетаешь и другие понятия: сигнатуры, линковку, модули и пр. указывает на то, что ты не понимаешь ни первого, ни второго, ни третьего. И все это только усиливает впечатление. Это нужно какой-то специальный дар иметь — три десятка лет использовать язык и нифига о нем не знать вообще.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 23.01.2023 21:04 rg45 . Предыдущая версия . Еще …
Отредактировано 23.01.2023 21:01 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 21:01 rg45 . Предыдущая версия .
Отредактировано 23.01.2023 20:55 rg45 . Предыдущая версия .
Re[6]: Для чего шаблонной функции нужна особая сигнатура?
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 23.01.23 21:44
Оценка:
Здравствуйте, rg45, Вы писали:

R>Умение объявить функцию — что уж может быть базовее.


Это Вы так изящно предположили, что мне за 28 лет ни разу не приходилось объявлять функции?

R>А то, что ты сюда невпопад приплетаешь и другие понятия: сигнатуры, линковку, модули и пр. указывает на то, что ты не понимаешь ни первого, ни второго, ни третьего.


Это сильно.
Re[7]: Для чего шаблонной функции нужна особая сигнатура?
От: rg45 СССР  
Дата: 23.01.23 21:53
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:


ЕМ>Это Вы так изящно предположили, что мне за 28 лет ни разу не приходилось объявлять функции?


Нет, это ВЫ в этой теме продемонстрировали свои навыки в этой области. А я просто оценил это зрелище.


R>>А то, что ты сюда невпопад приплетаешь и другие понятия: сигнатуры, линковку, модули и пр. указывает на то, что ты не понимаешь ни первого, ни второго, ни третьего.


ЕМ>Это сильно.


Как есть.
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 23.01.2023 21:55 rg45 . Предыдущая версия . Еще …
Отредактировано 23.01.2023 21:54 rg45 . Предыдущая версия .
Re: Для чего шаблонной функции нужна особая сигнатура?
От: Pzz Россия https://github.com/alexpevzner
Дата: 23.01.23 21:54
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

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


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