Сообщение Re: Для чего шаблонной функции нужна особая сигнатура? от 27.01.2023 17:05
Изменено 27.01.2023 17:13 vopl
Re: Для чего шаблонной функции нужна особая сигнатура?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Хотел в одной из библиотек сделать финт ушами: в заголовке оставить объявления нескольких одноименных функций с перегрузкой типов параметров, а в модуле реализовать их общим шаблоном, явно определив версии с допустимыми комбинациями параметров. По замыслу, это позволило бы линковать с ней другие библиотеки без перекомпиляции их исходников.
А вообще, такой финт вполне можно делать и со специализациями, не обязательно брать именно не-шаблонные функции
hdr.h — публичный заголовок
impl.cpp — реализация, в библиотеке
use.cpp — использование, в приложении, надо прилинковать библиотеку
ЕМ>Хотел в одной из библиотек сделать финт ушами: в заголовке оставить объявления нескольких одноименных функций с перегрузкой типов параметров, а в модуле реализовать их общим шаблоном, явно определив версии с допустимыми комбинациями параметров. По замыслу, это позволило бы линковать с ней другие библиотеки без перекомпиляции их исходников.
А вообще, такой финт вполне можно делать и со специализациями, не обязательно брать именно не-шаблонные функции
hdr.h — публичный заголовок
#pragma once
//#define MY_API __declspec(dllimport)
#define MY_API __attribute__((visibility("default")))
template <class> void MY_API mySuperPuperFunction();
impl.cpp — реализация, в библиотеке
//#define MY_API __declspec(dllexport)
#define MY_API __attribute__((visibility("default")))
template <class> void MY_API mySuperPuperFunction()
{
// код
}
// явно определив версии с допустимыми комбинациями параметров
template <> void mySuperPuperFunction<int>();
template <> void mySuperPuperFunction<char>();
use.cpp — использование, в приложении, надо прилинковать библиотеку
#include <hdr.h>
int main()
{
mySuperPuperFunction<int>();//ок
mySuperPuperFunction<char>();//ок
mySuperPuperFunction<short>();//не ок, ошибка линковки
return 0;
}
Re: Для чего шаблонной функции нужна особая сигнатура?
Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Хотел в одной из библиотек сделать финт ушами: в заголовке оставить объявления нескольких одноименных функций с перегрузкой типов параметров, а в модуле реализовать их общим шаблоном, явно определив версии с допустимыми комбинациями параметров. По замыслу, это позволило бы линковать с ней другие библиотеки без перекомпиляции их исходников.
А вообще, такой финт вполне можно делать и со специализациями, не обязательно брать именно не-шаблонные функции
hdr.h — публичный заголовок
impl.cpp — реализация, в библиотеке
use.cpp — использование, в приложении, надо прилинковать библиотеку
ЕМ>Хотел в одной из библиотек сделать финт ушами: в заголовке оставить объявления нескольких одноименных функций с перегрузкой типов параметров, а в модуле реализовать их общим шаблоном, явно определив версии с допустимыми комбинациями параметров. По замыслу, это позволило бы линковать с ней другие библиотеки без перекомпиляции их исходников.
А вообще, такой финт вполне можно делать и со специализациями, не обязательно брать именно не-шаблонные функции
hdr.h — публичный заголовок
#pragma once
//#define MY_API __declspec(dllimport)
#define MY_API __attribute__((visibility("default")))
template <class> void MY_API mySuperPuperFunction();
impl.cpp — реализация, в библиотеке
//#define MY_API __declspec(dllexport)
#define MY_API __attribute__((visibility("default")))
template <class> void MY_API mySuperPuperFunction()
{
// код
}
// явно определив версии с допустимыми комбинациями параметров
template void mySuperPuperFunction<int>();
template void mySuperPuperFunction<char>();
use.cpp — использование, в приложении, надо прилинковать библиотеку
#include <hdr.h>
int main()
{
mySuperPuperFunction<int>();//ок
mySuperPuperFunction<char>();//ок
mySuperPuperFunction<short>();//не ок, ошибка линковки
return 0;
}