読者です 読者をやめる 読者になる 読者になる

C++03 で 関数ポインタ型をわかりやすく定義する

さて、C++03 時代に関数ポインタ型を定義する場合は、

// int func(int, int); を保持する
// func_type という名前の関数ポインタ型の定義
typedef int(*func_type)(int, int);

みたいに定義する必要があります。
しかし、上のコードを見てもわかるとおり、定義の真ん中に名前を記述する必要があったりとちょっとわかりづらいですね。

[identity を使う]

そこで次のようなヘルパクラスを使うことでもっとわかりやすく定義する事ができます。

// T を再定義するためだけのクラス
template<typename T>
struct identity{
    typedef T type;
};

// identity に int(*)(int, int) みたいな型を渡すだけで
// 関数ポインタ型を定義することができる
typedef identity<int(*)(int, int)>::type func_type;

int
plus(int a, int b){
    return a + b;
}

// 変数を定義するときにも利用できる
identity<int(*)(int, int)>::type f_ptr = plus;

これなら書きやすいし、何よりわかりやすいですね。
identity 自体はすごく単純なクラスですが、こういうことに利用できます。
ちなみに identity は Boost.MPL や C++11 の標準ライブラリにも組み込まれています。
まぁそもそも C++11 であれば using を使ってもっと簡単に

using func_type = int(*)(int, int);

と、定義することもできるんですが。