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;