Когда нам нужно явно создать экземпляр функции-шаблона?
Допустим, у нас есть шаблонная функция:
template <class T> T max(T a, T b) { return a > b ? a : b; }
Поскольку компилятор не выполняет никакого неявного преобразования типов во время вывода аргументов шаблона, мы можем вызвать max(2, 5.5)
этими двумя способами:
- Используя кастинг:
max(static_cast<float>(2), 5.5f);
- Использование явного создания шаблона:
max<float>(2, 5.5);
Второй случай имеет смысл для меня, но когда мы делаем явное создание экземпляра шаблона описанным ниже способом (создание экземпляра без вызова функции max
с типом символа):
template char max(char a, char b);
Чего мы добиваемся из этого?
1 ответ
Если вы пишете библиотеку, то шаблоны, не вызванные кодом библиотеки, не будут реализованы, поэтому в библиотеке могут отсутствовать некоторые функции, которые вы намеревались предоставить. Явное создание экземпляра заставит компилятор создать реализацию для указанного шаблона, даже если к нему не было обращений.
Когда вы наконец свяжете свою библиотеку с клиентским приложением, то компоновщик найдет реализацию для типов, которые поддерживает ваша библиотека.
Возможно, объяснение от носителя английского языка будет более понятным: https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation