7

ダブルと整数のみを有効にすると、4つの関数になります。しかし、すべてのデータ型(int long float double unsigned numberなど)を有効にしたいのですが、どうすれば可能ですか?

#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これは、どちらかの引数がである場合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関数は常に最初の引数のような型の値を返します。最初の場合は浮動小数点数ですが、2番目の場合は整数であることに注意してください。

于 2012-11-03T12:17:31.333 に答える
1

同じのテンプレートを定義できます

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

このコードは、演算子のように多くの仮定を行います-Tに対して定義され、戻り型は常に型Tなどになります...

于 2012-11-03T12:12:14.480 に答える
1

たとえば、絶対値を使用して常に差を計算できます

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

ただし、以前の回答のようにテンプレートを使用することをお勧めします。

于 2012-11-03T12:25:31.137 に答える