Как я могу кратко написать множество явных экземпляров шаблонов функций?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу кратко написать множество явных экземпляров шаблонов функций?

Сообщение Anonymous »

Я пишу библиотеку 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»