在C ++中使用模板专业化

时间:2011-01-09 19:49:23

标签: c++ templates

如何使用具有2种不同输入类型和输出类型的模板特化来编写函数:

template <class input1, class input2, class output>

并返回2个数字的总和(整数/双精度数)。但是,如果我得到2个整数,我想返回一个整数类型,但对于整数和双精度的任何其他组合,我总是返回double。

我试图这样做而不直接使用'+'运算符,而是使用下一个函数:

double add_double_double(double a, double b) {return (a+b);}
double add_int_double(int a, double b) {return ((double)(a)+b);}
int   add_int_int(int a, int b) {return (a+b);}

5 个答案:

答案 0 :(得分:5)

如果你可以使用C ++ 0x,你可以这样做:

template <typename T, typename U>
auto add(T lhs, U rhs) -> decltype(lhs+rhs)
{
    return lhs+rhs;
}

答案 1 :(得分:4)

不要使用模板专业化。请改用重载。专业功能很复杂,很少需要:

template <typename T1, typename T2>
double sum(T1 a, T2 b) { return a + b; }

int sum(int a, int b) { return a + b; }

当且仅当两个参数均为int时,才会调用第二个版本;否则,将调用第一个版本。

答案 2 :(得分:0)

这可能就是您所需要的:

#include <iostream>
using namespace std;

template <class input1, class input2, class output> output add(input1 n1, input2 n2) {
   return (output) n1 + (output) n2;
}

int main(int argc, char **argv) {

   cout << add<int, int, int>(1,1) << endl;
   cout << add<float, int, float>(1.1f,1) << endl;
   cout << add<int, float, float>(1,1.1f) << endl;
   cout << add<float, float, int>(1.1f,1.1f) << endl;

   return 0;
}

结果:

quad: > ./a.out 
2
2.1
2.1
2
Sun 09 Jan 2011 12:57:57 PM MST

quad: > 

答案 3 :(得分:0)

你的问题的答案在于C++ templates书的第15章。本章有一个accumulator example来解决您的问题。在本章的后面,它将讨论促销特征,它将解决添加两种不同类型的问题,并解决类型推广问题。

答案 4 :(得分:0)

函数模板的返回类型可能取决于模板参数的类型。在您的情况下,您可以执行类似的操作:

template <typename L, typename R>
struct sum_traits { typedef double return_type; };

template <>
struct sum_traits<int, int> { typedef int return_type; };

template <typename L, typename R>
typename sum_traits<L, R>::return_type
sum(L l, R r) { 
  typedef typename sum_traits<L, R>::return_type ret_t;
  return ret_t(l) + ret_t(r); 
}

我不认为ret_t的显式转换在这种情况下实际上需要 ,但它展示了更多的技术。

这只处理整数,但这个想法可以很容易地推广到处理更复杂的情况。