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 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.