// --------------------------------
// 関数の"型"の話
// --------------------------------
//↓ 引数として何かの関数を受け取るテンプレート
template<typename F>
void foo(F f)
{
printf("%d\n", f());
}
//↓「戻り値としてint型を持ち、引数がvoidされた関数」と言う型を持つ関数
int bar()
{
return 5963;
}
int main()
{
//↓「戻り値としてint型を持ち、引数がvoidされた関数」を型に指定されたテンプレート関数に
//↓その型に該当する関数を渡している
foo<int (*)(void)>(bar);
//↓typedefは「そのフォーマットの中でプログラマが任意に付けた名前(変数名など)を
//↓新たな型とみなす様にコンパイラに指示する物なので‥‥
typedef int (*hoge)(void);
//↓当然これでもおk
foo<hoge>(bar);
return 0;
}