по return type:
template<typename T>
T add( double a, double b ) {
return static_cast<T>( a + b );
}
Если например будет два вызова функции, где T будет float и int
возвращаемый тип не участвует в процессе разрешения перегрузки, но вызвать-то ты ее можешь: auto r1 = add<int>(10., 20.); auto r2 = add<double>(4., 5.);
Хм. Выходит будут сгенерированы вот такие функции: int add( double, double ); float add( double, double ); Это наверное работает только для фундаментальных типов?
для любым типов, почему для фундаментальных только?
Не пойму, как могут быть функции с одинаковыми названиями и типами аргументов, но разными возвращаемыми типами. Вроде же такое нельзя делать, ведь компилятор не смотрит на возвращаемый тип при перегрузки функций (а больше ничем другим функции не отличаются)
в данном случае вы имеете дело с полными специализациями функции, а для них все однозначно, вы указываете аргументы шаблона явно, поэтому у компилятора нет вопроса какую специализацию вызвать
Шаблонные типы вообще не обязаны участвовать ни в return type ни в параметрах. Функция может быть и такой template<class UpdateStage> void update() например
Понял, спасибо! А частичная специализация так не умеет, да? Как здесь например: template <> void add<int>(double, double); template <> void add<double>(double, double);
Это не частичная специализация
Я написал псевдо-код, вот реальный пример: template <typename T> inline typename std::enable_if<std::is_same<T, int>::value, void>::type add(double, double); template <typename T> inline typename std::enable_if<std::is_same<T, double>::value, void>::type add(double, double); Выглядит конечно офигеть как странно, но может быть сработает? :)
Это не функция, а шаблон функции
1. Прочитайте про helper types
2. Что бы это ни было, это всё ещё не частичная специализация
И да, в этом примере это не просто стилистическая поправка - если вы обратитесь к разделу стандарта defns вы узнаете, что для шаблона функции возвращаемое значение является частью сигнатуры (то есть допустима даже перегрузка по возвращаемому значению)
Интересно почему это не частичная специализация? Вроде специализация и вроде частичная. Или что-то упускаю?
Частичная специализация это: template <typename T, typename R> class A {}; template <typename T> class A<T, int> {}; Частичной специализации функций вообще нет
Обсуждают сегодня