Re[4]: Вопрос по коду (шаблоны функций)
От: Bell Россия  
Дата: 23.10.10 05:15
Оценка: +1
Здравствуйте, Lexey, Вы писали:

L>Здравствуйте, networm87, Вы писали:


N>>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?


L>У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.

Частичная специализация для шаблонов функций в текущем стандарте не разрешена. Это перегрузка.
Любите книгу — источник знаний (с) М.Горький
Вопрос по коду (шаблоны функций)
От: networm87  
Дата: 22.10.10 06:48
Оценка:
Здравствуйте! Прошу прощения если это уже было на форуме, но я не знаю по каким критерия искать ответ на мой вопрос. Вопрос в следущем, почему возможно сделать разные возвращаемые значения у шаблонной функции (в примере функция 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; }
};

// Void
template<class T>
void test(T);

// class R
template<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;
}


На codepad:
http://codepad.org/SlYy10st

PS: извиняюсь что пример такой странный, не смог быстро придумать более простой.
Re: Вопрос по коду (шаблоны функций)
От: Bell Россия  
Дата: 22.10.10 07:24
Оценка:
Здравствуйте, 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.
...



Если вопрос не про это — тогда сформулируй понятнее.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Вопрос по коду (шаблоны функций)
От: networm87  
Дата: 22.10.10 10:38
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если ты имеешь ввиду тип возвращаемого значения, то если коротко — у шаблонов функций тип возвращаемого значения входит в сигнутуру.


Да я спрашивал про тип возвращаемого значения, спасибо. Насколько я понял это означает что пример написан правильно, но тогда я не совсем понимаю как это работает. Не знаю как правильно сформулировать, просто смущает что тут:
template<class T>
void test(T);

явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?
Re[3]: Вопрос по коду (шаблоны функций)
От: Lexey Россия  
Дата: 22.10.10 11:19
Оценка:
Здравствуйте, networm87, Вы писали:

N>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?


У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.
Re[4]: Вопрос по коду (шаблоны функций)
От: networm87  
Дата: 22.10.10 12:05
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Здравствуйте, networm87, Вы писали:


N>>явно указано что тип возвращаемого значения void. Получается что при подстановке шаблонных параметров компилятор не смотрит на тип возвращаемого значения пока не развернет весь шаблон?


L>У тебя для этого шаблона есть частичная специализация с другим типом возвращаемого значения. Она имеет приоритет на общим шаблоном.


Ясно, спасибо всем за ответы
Re: Вопрос по коду (шаблоны функций)
От: rg45 СССР  
Дата: 23.10.10 06:37
Оценка:
Здравствуйте, 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);

При переходе к шаблонным функциям мы получаем возможность два семейства функций описать двумя различными шаблонами. При этом возможность возвращать из функций результаты разных типов сохраняется.
--
Справедливость выше закона. А человечность выше справедливости.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.