7

如果我只启用双精度和整数,那么它是 4 个函数。但我想启用所有数据类型(int long float double unsigned numbers 等)这怎么可能?

#include <iostream>

using namespace std;

double diff(int num1, int num2) {
    return double(num1-num2);
}

double diff(int num1, double num2) {
    return double(num1)-num2;
}

double diff(double num1, int num2) {
    return num1-double(num2);
}

double diff(double num1, double num2) {
    return num1-num2;
}

int main() {
    int a = 10;
    double b = 4.4;
    cout << diff(a, b) << endl;
    return 0;
}
4

6 回答 6

9
template <typename T, typename U>
double diff(T a, U b) {
    return a - b;
}

您不需要强制转换double- 如果任何一个参数都是 a double,并且在return两者都是整数时,这是为您完成的。然而,

double diff(double a, double b);

也可以用int参数调用。

于 2012-11-03T12:10:38.240 回答
8

使用模板函数:

template <typename T1, typename T2>
double diff(const T1& lhs, const T2& rhs)
{
  return lhs - rhs;
}
于 2012-11-03T12:10:49.167 回答
4

您不必“启用”操作,只需编写:

cout << (a - b) << endl;
于 2012-11-03T12:10:21.237 回答
3

与以前的所有答案不同,我将添加关于 C++11 的内容。在 C++11 中,您可以使用decltype.

#include <iostream>

template <typename T1, typename T2>
auto diff(T1 a, T2 b) -> decltype(a)
{
   return (a - b);
}

int main() {
   std::cout << diff(3.5, 1) << std::endl;
   std::cout << diff(3, 1.5) << std::endl;
}

diff函数将始终返回类型的值,如第一个参数。请注意,在第一种情况下它是浮点数,但在第二种情况下它是整数。

于 2012-11-03T12:17:31.333 回答
1

例如,您始终可以使用绝对值来计算差异

cout << abs(a - b) << endl;

不过,您可能想使用以前的答案所说的模板。

于 2012-11-03T12:25:31.137 回答
1

您可以为相同的定义一个模板

template <typename T, typename U>
T diff(const T& a, const U& b) {
    return a - b;
}

这段代码做了很多假设,比如 operator - 是为 T 定义的,返回类型总是 T 类型等等......

于 2012-11-03T12:12:14.480 回答