Если у меня есть шаблон функции с typename T
, где компилятор может сам установить тип, мне не нужно явно писать тип, когда я вызываю функцию, например:
template < typename T >
T min( T v1, T v2 ) {
return ( v1 < v2 ) ? v1: v2;
}
int i1 = 1, i2 = 2; int i3 = min( i1, i2 ); //no explicit <type>
Но если у меня есть шаблон функции с двумя разными именами, например:
template < typename TOut, typename TIn >
TOut round( TIn v ) {
return (TOut)( v + 0.5 );
}
double d = 1.54;
int i = round<int>(d); //explicit <int>
Это правда, что я всегда должен указывать хотя бы одно имя типа? Я предполагаю, что причина в том, что C ++ не может различать функции между разными типами возврата.
Но если я использую функцию void и передаю ссылку, я снова не должен явно указывать возвращаемое имя типа:
template < typename TOut, typename TIn >
void round( TOut & vret, TIn vin ) {
vret = (TOut)(vin + 0.5);
}
double d = 1.54;
int i; round(i, d); //no explicit <int>
Следует ли делать вывод о том, чтобы избегать функций с возвратом и больше отдавать предпочтение void
функциям, которые возвращаются по ссылке при написании шаблонов? Или есть возможность избежать явной записи типа возврата? Что-то вроде "вывода типа" для шаблонов. Возможен ли «вывод типа» в C ++ 0x?