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

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

Изменено 27.01.2023 17:13 vopl

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

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


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

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 — публичный заголовок
#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;
}