如何在C++中计算两个数字的差?

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;
}

2
只需要说a - b,不要管这个diff。C++编译器会选择最佳方法进行计算。 - PiotrNycz
谢谢你的回复。我不想使用diff函数,我只是想了解它的工作原理... - Don Pavilon
1
这是你问题的一个糟糕示例(甚至可能不存在问题)。有标准算术转换会自动发生,因此你只需要double(double,double)版本。 - Kerrek SB
6
我不明白为什么这个问题应该被踩。虽然它来自一个新手,而且在这种特殊情况下你可以简单地使用a-b,但这是展示如何以及为什么使用模板的有趣方式。这也可能在您使用对象而不是简单数据类型(例如矩阵或函数)时非常方便。 - Ferdinando Randisi
6个回答

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

你不需要将其转换为双精度浮点数(double),如果其中一个参数是双精度浮点数,这一点会为你自动完成;当两个参数都是整数时,在 return 过程中也会进行转换。但是,请注意:
double diff(double a, double b);

可以使用int参数来调用。

除非您也将返回类型设置为通用类型,否则这并不比他已经拥有的好多少? - thedayofcondor
@thedayofcondor:我不理解你的评论。它使用单个函数解决了问题,而不是四个或更多函数。 - Fred Foo
1
我的意思是,double diff(double,double)也可以解决他的问题... diff(int,int)应该返回double还是int? - thedayofcondor
1
@larsmans 我相信thedayofcondor的意思是,如果模板的签名是template<typename T, typename U> auto diff(T a, U b) -> decltype(a-b);,那么它会更有意义。这是一个有效的关注点,尽管它与作者试图解决的问题没有太多关系。 - Cubic

8

使用模板函数:

template <typename T1, typename T2>
double diff(const T1& lhs, const T2& rhs)
{
  return lhs - rhs;
}

1
我不希望我的int差异返回一个double。同样,complex<double>的差异也是如此。从参数推断返回类型,我们可以达成协议。 - Daniel Fischer
2
@DanielFischer:一个 double 的返回类型符合原帖的要求。 - Fred Foo
@larsmans刚看到了这个,让我感到非常失望。所以我投了这个解决方案的赞成票。 - Daniel Fischer

4

不需要“启用”操作,只需写:

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

1
我猜区别只是一个例子...他想了解模板。 - nico
1
问题陈述为:“如何在C++中计算两个数字的差异?” - thedayofcondor

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函数总是返回与第一个参数相同类型的值。请注意,第一个例子中它是浮点数,但在第二个例子中它是整数。


1
你可以使用 decltype(a - b) - Inverse

1

你可以为其定义一个模板

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

这段代码做了很多假设,比如必须为T定义了操作符“ - ”,并且返回类型始终为T类型等等...

1

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

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

不过,像之前的回答所说,您可能想要使用模板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接