如果我有一个带有 的函数模板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>
我总是必须指定至少 1 个类型名,这是真的吗?我认为原因是因为 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 中是否可以进行“类型推断”?