C++ の関数ポインタの Typedef

Muhammad Zohaib 2023年10月12日
  1. typedef キーワード
  2. 関数ポインターを使用した typedef
C++ の関数ポインタの Typedef

この記事では、C/C++ における typedef の目的について説明します。 関数ポインターで typedef を使用する方法と、それを使用する利点についてさらに説明します。

最初に typedef とその一般的な使用法について説明しましょう。

typedef キーワード

typedef は型定義を表します。 名前が示すように、typedef は、既存のデータ型 (変数の型) に新しい名前を割り当てる方法です。

たとえば、整数変数を格納する場合、データ型は int になります。 同様に、文字または文字列のデータ型は、単語または句に使用されます。

#include <iostream>
#include <string>
using namespace std;

int main() {
  int a = 10;
  string greeting = "Hello!";
  return 0;
}

typedef の助けを借りて、使用されている実際の型から離れて、変数が何を意味するかという考えにもっと集中することができます。 これにより、きれいなコードを簡単に記述できるだけでなく、コードの編集もはるかに簡単になります。

たとえば、クリケットの試合後に 3 人の異なるプレーヤーの発言を記録する場合、typedef を使用できます。

#include <iostream>
using namespace std;

int main() {
  typedef char* statement;
  statement PlayerA = "I played bad";
  statement PlayerB = "I played very well";
  statement PlayerC = " I could not get the chance to Bat";
  cout << "Player A said:" << PlayerA;
  return 0;
}

上記のコードでは、char* は、新しい名前 statement でこのデータ型を変更するために typedef キーワードを適用した文字ポインタです。 この場合、プレーヤーの発言を記録しているため、この新しいエイリアスはより意味があります。

したがって、typedef はコードの可読性を高めます。

typedef は関数ポインタでも使用できます。 それに飛び込む前に、関数ポインタを簡単に紹介しましょう。

関数ポインタ

C++ では、ポインタは変数のメモリ アドレスを保持する変数です。 同様に、関数ポインターは、関数のアドレスを保持するポインターです。

関数ポインターは、次のコードで宣言できます。

int (*point_func)(int, int);

上記のコードで、point_func は、引数として 2つの整数変数と戻り値の型として int を持つ関数を指すポインターです。

関数ポインターを使用した typedef

関数ポインタを持つ typedef の構文は、どこか奇妙に見えます。 関数ポインター宣言の先頭に typedef キーワードを配置するだけで済みます。

typedef int (*point_func)(int, int);

上記のコマンドは、point_func (2つの int 引数を取り、整数を返す関数ポインター、つまり int (*) (int, int)) という名前の新しい型を定義したことを意味します。 これで、この新しい名前をポインター宣言に使用できます。

次のプログラミング例を見てみましょう。

#include <iostream>
using namespace std;

int abc(int x1, int x2) { return (x1 * x2); }
int main() {
  typedef int (*pair_func)(int, int);
  pair_func PairProduct;  // PairProduct is pointer of type pair_func
  PairProduct = &abc;  // PairProduct pointer holds the address of function abc
  int product = (*PairProduct)(20, 5);
  cout << "The product of the pair is: " << product;
  return 0;
}

出力:

The product of the pair is: 100

関数ポインターの前に使用された場合に typedef が何をするかは、ここまで明らかです。 abc 関数は 2つの引数を取り、上記のコードでそれらの積を返します。

main 関数では、typedef を使用して関数ポインターの新しい名前を定義しました (つまり、pair_func)。 次に、pair_func 型の PairProduct を定義し、関数 abc アドレスを割り当てました。

その後、ポインター PairProduct を逆参照し (より単純な構文)、2つの引数を渡すことによって、関数 abc を呼び出しました。