Когда нам нужно явно создать экземпляр функции-шаблона?

Допустим, у нас есть шаблонная функция:

template <class T> T max(T a, T b) { return a > b ? a : b; }

Поскольку компилятор не выполняет никакого неявного преобразования типов во время вывода аргументов шаблона, мы можем вызвать max(2, 5.5) этими двумя способами:

  1. Используя кастинг: max(static_cast<float>(2), 5.5f);
  2. Использование явного создания шаблона: max<float>(2, 5.5);

Второй случай имеет смысл для меня, но когда мы делаем явное создание экземпляра шаблона описанным ниже способом (создание экземпляра без вызова функции max с типом символа):

template char max(char a, char b);

Чего мы добиваемся из этого?

1 ответ

Решение

Если вы пишете библиотеку, то шаблоны, не вызванные кодом библиотеки, не будут реализованы, поэтому в библиотеке могут отсутствовать некоторые функции, которые вы намеревались предоставить. Явное создание экземпляра заставит компилятор создать реализацию для указанного шаблона, даже если к нему не было обращений.

Когда вы наконец свяжете свою библиотеку с клиентским приложением, то компоновщик найдет реализацию для типов, которые поддерживает ваша библиотека.

Возможно, объяснение от носителя английского языка будет более понятным: https://docs.microsoft.com/it-it/cpp/cpp/explicit-instantiation

Другие вопросы по тегам