Здравствуйте, Lexey, Вы писали:
L>Здравствуйте, networm87, Вы писали:
N>>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?
L>У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.
Частичная специализация для шаблонов функций в текущем стандарте не разрешена. Это перегрузка.
Здравствуйте! Прошу прощения если это уже было на форуме, но я не знаю по каким критерия искать ответ на мой вопрос. Вопрос в следущем, почему возможно сделать разные возвращаемые значения у шаблонной функции (в примере функция test):
#include <iostream>
template<class T>
class TTest;
template<class R, class T>
class TTest<R(T)>
{
public:
TTest(){};
R square(T _t) { return (R)_t * _t; }
};
// Voidtemplate<class T>
void test(T);
// class Rtemplate<class R, class T>
R test(TTest<R(T)> _test)
{
return _test.square(2);
}
int main()
{
TTest<float(int)> obj;
float a = test(obj);
std::cout << "A: " << a;
}
Здравствуйте, networm87, Вы писали:
N>Здравствуйте! Прошу прощения если это уже было на форуме, но я не знаю по каким критерия искать ответ на мой вопрос. Вопрос в следущем, почему возможно сделать разные возвращаемые значения у шаблонной функции (в примере функция test):
Если ты имеешь ввиду тип возвращаемого значения, то если коротко — у шаблонов функций тип возвращаемого значения входит в сигнутуру.
Первоисточник:
1.3.10 signature
the information about a function that participates in overload resolution (13.3): the types of its parameters
and, if the function is a class member, the cv- qualifiers (if any) on the function itself and the class in which
the member function is declared.2) The signature of a function template specialization includes the types of
its template arguments (14.5.5.1).
14.5.5.1/4
The signature of a function template consists of its function signature, its return type and its template parameter list.
...
Если вопрос не про это — тогда сформулируй понятнее.
Здравствуйте, Bell, Вы писали:
B>Если ты имеешь ввиду тип возвращаемого значения, то если коротко — у шаблонов функций тип возвращаемого значения входит в сигнутуру.
Да я спрашивал про тип возвращаемого значения, спасибо. Насколько я понял это означает что пример написан правильно, но тогда я не совсем понимаю как это работает. Не знаю как правильно сформулировать, просто смущает что тут:
template<class T>
void test(T);
явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?
Здравствуйте, networm87, Вы писали:
N>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?
У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.
Здравствуйте, Lexey, Вы писали:
L>Здравствуйте, networm87, Вы писали:
N>>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?
L>У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.
Здравствуйте, networm87, Вы писали:
N>Здравствуйте! Прошу прощения если это уже было на форуме, но я не знаю по каким критерия искать ответ на мой вопрос. Вопрос в следущем, почему возможно сделать разные возвращаемые значения у шаблонной функции (в примере функция test):
N>
N>// Void
N>template<class T>
N>void test(T);
N>// class R
N>template<class R, class T>
N>R test(TTest<R(T)> _test)
N>{
N> return _test.square(2);
N>}
N>
Для шаблонных функций, так же как и для нешаблонных, допустимы перегрузки по параметрам. И точно так же разные перегрузки могут иметь разные типы возвращаемого значения. Потому, что по сути это разные функции.
Для простоты давай рассмотрим сначала нешаблонные функции. Вот вполне легальный пример:
void test(int);
void test(float);
void test(long);
float test(TTest<float(int)> _test);
long test(TTest<long(float)> _test);
int test(TTest<int(long)> _test);
При переходе к шаблонным функциям мы получаем возможность два семейства функций описать двумя различными шаблонами. При этом возможность возвращать из функций результаты разных типов сохраняется.
--
Справедливость выше закона. А человечность выше справедливости.