いろきゅうの(元)はてなダイアリー

はてなダイアリーから移行中…

boost::functionを読んでみた<2>

<<昨日の続き>>
で、次に来るのが 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;
}

なんちゅーことが出来るらしい……。


……はー、C++C言語か^^;) は難しい。(苦笑 orz