C++ での関数のオーバーロード

胡金庫 2023年10月12日
  1. C++ でオーバーロードされた関数を定義する
  2. C++ のテンプレートでオーバーロードされた関数を使用する
C++ での関数のオーバーロード

この記事では、C++ で関数のオーバーロードを使用する複数の方法を示します。

C++ でオーバーロードされた関数を定義する

関数のオーバーロードは、さまざまなタイプのオブジェクトに適用できる関数を提供するアドホック多相性の一部として知られています。つまり、これらの関数は、指定されたスコープ内で同じ名前で定義されており、引数の数またはタイプが異なる必要があります。オーバーロードされた関数は、コンパイル時に解決されるさまざまな関数のセットにすぎないことに注意してください。後者の機能は、仮想関数に使用される実行時のポリモーフィズムとは異なります。コンパイラーは引数のタイプを監視し、呼び出す関数を選択します。

オーバーロードされた関数は、パラメーターのタイプまたはパラメーターの数が異なる必要があります。そうしないと、コンパイラエラーが発生します。オーバーロードされた関数間で戻り型が異なる場合や、エイリアス型が引数として使用されている場合でも、コンパイラはエラーで失敗します。次の例では、数値を合計するための 3つの静的関数を持つ Math 構造を実装しました。各関数は異なるタイプの引数ペアを取り、対応するタイプを返します。その結果、Math::sum は異なるタイプのベクトル要素で呼び出すことができます。struct キーワードは C++ でクラスを定義し、そのメンバーはデフォルトでパブリックであることに注意してください。

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

struct Math {
  static auto sum(int x, int y) { return x + y; }

  static auto sum(float x, float y) { return x + y; }

  static auto sum(double x, double y) { return x + y; }
};

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 5};
  vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};

  for (const auto &item : vec1) {
    cout << Math::sum(item, item * 2) << "; ";
  }
  cout << endl;

  for (const auto &item : vec2) {
    cout << Math::sum(item, item * 2) << "; ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

出力:

3; 6; 9; 12; 15;
3; 6; 9; 12; 15;

C++ のテンプレートでオーバーロードされた関数を使用する

テンプレートは、C++ 言語で実装されたジェネリックプログラミングの形式です。どちらもコンパイル時に推測されるため、関数のオーバーロードと同様の機能があります。次のコードスニペットには、ジェネリックベクトルの要素を出力する printExponentVec 関数があることに注意してください。したがって、タイプごとに同じ操作を実行するために使用されますが、タイプごとに異なる関数本体を実装する場合は、関数のオーバーロードを使用する必要があります。

#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::string;
using std::vector;

struct ExponentTwo {
  static auto Calc(int n) { return n * n; }
  static auto Calc(float n) { return n - n * n; }
  static auto Calc(double n) { return n + n * n; }
};

template <typename T>
void printExponentVec(const vector<T> &vec) {
  for (auto &i : vec) {
    cout << ExponentTwo::Calc(i) << "; ";
  }
  cout << endl;
}

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 5};
  vector<float> vec2 = {1.0, 2.0, 3.0, 4.0, 5.0};

  printExponentVec(vec1);
  printExponentVec(vec2);

  return EXIT_SUCCESS;
}

出力:

1; 4; 9; 16; 25;
0; -2; -6; -12; -20;
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Function