繁体   English   中英

具有灵活返回类型的C ++函数模板

[英]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 ) { ... }

如果您选择尝试此解决方案,我建议使用自动生成的头文件生成促销专精。


编辑:我在阅读其他(现已删除)答案后重新阅读了该问题:

您无法返回较小变量的类型。 那是因为变量的值只能在运行时找到,而函数返回类型必须在编译时定义。

我提出的解决方案将始终返回两个变量类型之间的最强类型。

如前所述,您希望采用更通用的类型。 比如, intdouble应该变成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;
}

这将始终返回一个副本,即使T1T2是相同的类型(如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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM