【发布时间】:2011-02-19 11:53:51
【问题描述】:
如果我有一个带有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 中是否可以进行“类型推断”?
【问题讨论】:
-
类型之间的转换使类型推断的想法变得笨拙,因此您不能重载返回类型,并且必须在它是模板参数时指定它。
-
您可能想要处理您的舍入算法。 -1.54 应该是什么?并且:如果你想得到一个四舍五入的 double 值怎么办?
标签: c++ templates types inference