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

时间:2010-12-25 16:19:09

标签: c++ templates

假设我们有一个像这样的函数

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;”视为较小的类型没有类型铸造?

编辑: 函数中涉及的类型可以是从简单类型到复杂类的任何类型,其中某些时候无法进行类型转换。

2 个答案:

答案 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)

如前所述,您希望采用更通用的类型。例如,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)一样使用它,它可以传递临时值,并直接使用结果,那就没关系了。结果可用,仍可以复制到局部变量中。