[英]C++ Function Template With Flexible Return Type
让我们说我们有这样的功能
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是<a,那么c的值将被类型转换为int。
是否可以使返回类型具有灵活性,以便返回int,long或任何其他类型的“<”而不是类型的类型?
编辑:函数中涉及的类型可以是从简单类型到复杂类的任何类型,其中某些时候无法进行类型转换。
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 ) { ... }
如果您选择尝试此解决方案,我建议使用自动生成的头文件生成促销专精。
编辑:我在阅读其他(现已删除)答案后重新阅读了该问题:
您无法返回较小变量的类型。 那是因为变量的值只能在运行时找到,而函数返回类型必须在编译时定义。
我提出的解决方案将始终返回两个变量类型之间的最强类型。
如前所述,您希望采用更通用的类型。 比如, 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)
,它可以通过临时,并直接使用结果,这一切都很好。 结果可用,仍可以复制到局部变量中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.