Я пишу библиотеку C++, содержащую множество шаблонов функций, которые я хочу явно создать и экспортировать для нескольких параметров типа. В моем конкретном случае у меня есть множество шаблонов числовых функций, которые я хочу отдельно создать и скомпилировать для float, double и long double. Выглядят они примерно так:
Код: Выделить всё
template
T calculate_a(T x) { ... }
template
T calculate_b(T x, T y) { ... }
// ...
Если у меня есть M шаблонов функций и N базовых типов, то мне нужно напечатать M*N явных экземпляров. Можно ли записать эти экземпляры более кратко?
Мое текущее решение — использовать макрос препроцессора, который выполняет все экземпляры для данного типа:
Код: Выделить всё
#define EXPLICITLY_INSTANTIATE(T) \
template T calculate_a(T x); \
template T calculate_b(T x, T y); \
// ...
EXPLICITLY_INSTANTIATE(float);
EXPLICITLY_INSTANTIATE(double);
EXPLICITLY_INSTANTIATE(long double);
Однако это неоптимально, поскольку требует отдельного хранения еще одной копии сигнатуры каждого шаблона функции. Кроме того, если я хочу сделать это в нескольких единицах перевода, мне нужно отдельно вести список базовых типов в каждой. (Предположим, что C++2a добавляет тип long long double, который я хочу поддерживать; мне придется добавить EXPLICITLY_INSTANTIATE(long long double); в каждый файл.)
Другой возможный подход — собрать все мои функции в шаблонный класс (только статический):
Код: Выделить всё
template
class calculate {
T a(T x) { ... }
T b(T x, T y) { ... }
};
template class calculate;
template class calculate;
template class calculate;
Это решает первую проблему отдельного хранения двух копий каждой подписи, но требует, чтобы я заменял каждый вызов Calculate_a на Calculate::a . Это не решает вторую проблему.
Подробнее здесь:
https://stackoverflow.com/questions/503 ... antiations