2

Я знаю, что Функциональные шаблоны используются для того, чтобы сделать функции переносимыми и чтобы они могли использоваться с любыми типами данных.Шаблоны функций - Явная специализация vs Глобальные функции (C++)

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

Но вместо Явной специализации мы могли бы также просто закодировать нешаблонной Функцию, которая может быть вызвана из main. Это сэкономит нам время на обработку, поскольку компилятор найдет Функции Nontemplate быстрее, чем Явно специализированные шаблонные функции, которые, в свою очередь, будут лучше с точки зрения эффективности.

Так почему же мы используем Явной Специализация, когда у нас есть альтернативы просто звонят нешаблонных Функций?

Пожалуйста, исправьте меня, если я ошибаюсь!

Edit 1: сказали мне моему профессор, что всякий раз, когда мы делаем шаблоны функций и вызвать функцию из main, компилятор сначала ищет шаблонные функции и, если его не в состоянии обнаружить, что, то он ищет шаблон функции, из которого он в свою очередь делает шаблонную функцию, а затем вызывает ее.

+0

Вы говорите об этом в контексте C++? в таком случае повторите вопрос, чтобы добавить тег C++. – Naveen

+0

@Naveen - Спасибо. Я добавил тег C++. – Pavitar

+0

Когда вы говорите «глобальная функция», вы имеете в виду «функцию без функции», правильно? –

ответ

1

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

Явная специализация используется, когда у вас есть специальный случай, который может быть полезен при специальной обработке. Иногда это происходит, как в случае с std::vector<bool>, в то время как в других случаях это очень удобно. Это означает, что пользователю функции не нужно знать, что есть специальный случай; это просто прозрачно.

+0

Да, потому что наш профессор сказал нам, что потребуется больше времени на обработку. Теперь я получил его, спасибо. +1 – Pavitar

1

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

+0

Вы должны, вероятно, также указать, что он, по сути, ошибочен: глобальные функции также не будут более эффективными. – Nick

+0

Потребителю API все равно. Функция перегрузки, а также функция и шаблон функции с тем же именем могут быть найдены во время разрешения имени и могут быть рассмотрены как кандидаты во время разрешения перегрузки. Есть несколько раз, что потребитель API будет заботиться, например, если шаблон функции явно используется (например, 'f <> (x)' вместо 'f (x)') или если некоторые аргументы шаблона не могут быть выведены из аргументов функции (в этом случае потребитель должен решить, что делать в любом случае). –

4

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

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

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

Почему мы используем Explicit Specialization, когда у нас есть альтернатива просто вызова глобальных функций?

В общем случае для шаблонов функций вы не используете явную специализацию, потому что это обычно путано и сложно. Стандарт ISO C++ имеет поэтическое предупреждение, чтобы быть чрезвычайно осторожным при специализировании шаблонов функций.Вы можете прочитать статью "Why Not Specialize Function Templates?" Herb Sutter для хорошего объяснения проблем и почему вы не хотите специализировать шаблоны функций.

+1

Большинство шаблонов функций никогда не будут специализированными, правда, но большую часть времени программист должен переопределить поведение шаблона функции, они собираются специализировать шаблон вместо введения новой перегрузки, поскольку вы можете специализироваться в 'namespace std', но стандарт не допускает новых перегрузок. Обычно 'std :: swap' достаточно, чтобы опрокинуть весы. –

+0

@Ben: 'std :: swap' не обязательно должен быть специализированным; предпочтительный метод, который я видел для реализации эффективного обмена, заключается в том, чтобы реализовать его как функцию nonmember рядом с рассматриваемым классом и позволить ADL найти его ('std :: swap' можно использовать в качестве резервного метода, используя' using std :: swap' перед вызовом 'swap()'). –

+0

@James: В этом случае '' не может найти пользовательский 'swap'. Лучший способ - реализовать свою собственную «своп» в качестве специализации (если вам нужен резервный случай, что-то, вероятно, неверно, а по умолчанию тривиально реализовать в любом случае) и поместить в его собственное пространство имен заглушку. Или наоборот. В любом случае это становится лучшим из обоих миров. – Potatoswatter

Смежные вопросы