如何使用具有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);}
答案 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
的显式转换在这种情况下实际上需要 ,但它展示了更多的技术。
这只处理整数,但这个想法可以很容易地推广到处理更复杂的情况。