Информация об изменениях

Сообщение Re: Для чего шаблонной функции нужна особая сигнатура? от 23.01.2023 18:09

Изменено 23.01.2023 18:52 rg45

Re: Для чего шаблонной функции нужна особая сигнатура?
Здравствуйте, Евгений Музыченко, Вы писали:

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




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

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

http://coliru.stacked-crooked.com/a/6f41c7014caa8bc2

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

template<RoundMethod>
double Round(double);

double Round(double v) { return Round<RoundMethod::Default>(v); }


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

Сколько времени, ты говоришь, программируешь на C++ — 42 года или 43? Очень странно, что приходится объяснять тебе такие азы.
Re: Для чего шаблонной функции нужна особая сигнатура?
Здравствуйте, Евгений Музыченко, Вы писали:

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




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

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

http://coliru.stacked-crooked.com/a/6f41c7014caa8bc2

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

template<RoundMethod>
double Round(double);

double Round(double v) { return Round<RoundMethod::Default>(v); }


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

Сколько времени, ты говоришь, программируешь на C++ — 42 года или 43? Очень странно, что приходится объяснять тебе такие азы.