假设我们有一个像这样的函数
template <class T, class T2>
T getMin(T a, T2 b) {
if(a < b)
return a;
return b;
}
如果我们调用这样的函数
int a, b;
long c;
a = getMin(b, c);
如果c是&lt; a,然后c的值将被类型转换为int。
是否可以使返回类型具有灵活性,以便返回int,long或任何其他被“&lt;”视为较小的类型没有类型铸造?
编辑: 函数中涉及的类型可以是从简单类型到复杂类的任何类型,其中某些时候无法进行类型转换。
答案 0 :(得分:10)
C ++ 0x将允许您使用auto
关键字,以便让编译器派生表达式的返回时间。
对于C ++ 03,我发现自动化此类过程的唯一方法是定义一个模板类Promotion
,它定义两种类型之间最强的类型,然后将它专门用于您可能需要的任何类型的类型使用
template<> class Promotion< long, int > { typedef long strongest; }
template<> class Promotion< int, long > { typedef long strongest; }
因此:
template< typename T1, typename T2 >
Promotion<T1,T2>::strongest function( const T1 &a, const T2 &b ) { ... }
如果您选择尝试此解决方案,我建议使用自动生成的头文件生成促销专精。
编辑:我在阅读了另一个(现已删除的)答案后重读了这个问题:
您无法返回较小变量的类型。那是因为变量的值只能在运行时找到,而函数返回类型必须在编译时定义。
我提出的解决方案将始终返回两个变量类型之间最强的类型。
答案 1 :(得分:1)
如前所述,您希望采用更通用的类型。例如,int
和double
应该成为double
; char*
和string
应成为string
。这适用于我的promote<>
模板。只需写下
template <class T1, class T2>
typename promote<T1, T2>::type getMin(T1 const& a, T2 const& b) {
if(a < b)
return a;
return b;
}
这将始终返回副本,即使T1
和T2
是相同的类型(如string
),这就是为什么我会为非const同类型重载它参数
template <class T>
T &getMin(T &a, T &b) {
if(a < b)
return a;
return b;
}
这两种变体似乎是一种合理的配置。如果你想要有更高的风险,但在更多的情况下,性能,解决方案,你可以接受T const&
,也接受临时。如果你像getMin(a + b, b + c)
一样使用它,它可以传递临时值,并直接使用结果,那就没关系了。结果可用,仍可以复制到局部变量中。