<<昨日の続き>>
で、次に来るのが boost::function<int (int)> と書いた場合の "int (int)"。コレって何よ? template用に何か特別な構文なんだろうか? それとも…?
と、ずっと謎でしたがー
ちゃんとした「型」なんですね。コレ。^^;
template<typename T>
class A
{};
このクラスに対して A<int (int)> なんてやると、T は "int __cdecl(int)" という型になりました。 …始めてみましたよ。こんな型。(笑 ^^;
で、コレが何なのか検証してみたんですが、
template<typename T> class A
{
void Func()
{
T test; // 関数宣言(?)
test(0); // ↓の int test(int) 呼び出し
}
}
int test(int n) { return 0; }
T は 「int を返して int を1つ取る関数」 になるらしく、T test; とやると test という関数を宣言する事になる模様。 T は関数を指す型なんで、testが変数ではなく関数と見なされる見たいです。
…ぱっと見不思議な構文だなぁ…。^^;
ただこれは、テンプレートに限った話ではなく
typedef int (*TFuncPtr)(int); // 関数ポインタ
typedef int TFunc(int); // 関数の型宣言(?)
TFunc Test; // 宣言
TFuncPtr fnVar = Test; // ポインタ代入
// 関数呼び出し
(*fnVar)(0);
((TFunc*)fnVar)(0);
((TFunc&)Test)(0);
int Test(int) // 関数定義
{
return 0;
}
なんちゅーことが出来るらしい……。