如果我有一个带有
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中是否支持“类型推断”?