Является ли полностью специализированная функция шаблона такой же, как обычная функция? - PullRequest
0 голосов
/ 11 февраля 2019

Если у меня есть:

template <typename T>
bool name (std::string);

template <> bool name<int>(std::string);

В чем разница между полностью специализированной функцией и моими другими обычными функциями.

Например, в заголовке я должен иметь эти объявления плюсопределение шаблона;тем не менее я могу иметь специализированное определение в исходном файле вместе со всеми другими обычными функциями.Одинаковы ли они?

Является ли это лучшей практикой, чем определение специализированного шаблона как inline в заголовке?

1 Ответ

0 голосов
/ 11 февраля 2019

Специализация шаблона функции определяет эффект вызова, когда сам шаблон выбирается с помощью разрешения перегрузки (в котором используется сигнатура, но не определение специализации).Это верно независимо от того, генерируется ли специализация неявно или явно.

Отдельная функция участвует в разрешении перегрузки сама по себе, конкурируя с шаблоном функции с небольшим преимуществом, которое может быть легко компенсировановывод аргумента шаблона (хотя и не здесь, так как ваш T не может быть выведен).Его можно полностью исключить с помощью явного списка аргументов шаблона (даже пустого, если все аргументы шаблона могут быть выведены), что означает, что шаблону все равно должно быть дано разумное определение для всех типов (даже если некоторыеудаляются или иным образом не компилируются).

Что касается inline, проблемы не отличаются от проблем для любой функции: предоставление определения в заголовке может быть важным для оптимизации, разрешить библиотеку только для заголовкауменьшить текстовое повторение, или просто создать более тесную связь, которая затруднит изменение кода.Поскольку определение первичного шаблона обычно должно быть в заголовке, возможно, имеется и уклон в сторону определения определения специализации.Как всегда, знание заявления и суждения требуется.

...