CQueueFunctorとは?

スクリプトなどで、バックグラウンド処理したいものは「キュー」の形で処理されています。
イメージ的には、「これ処理しておいて」とキューの形で投げる、です。
ちなみにネットワーク系統が「メッセージ処理」だったゆえ、キューは「メッセージポンプ」の仕組みかな……、 とみていたのですが、オブジェクトごと渡せるファンクタが使われておりました。
※ WindowsAPIでは::PostMessageですね。これを投げるとキューとして非同期に処理されます。

ファンクタとは?

オブジェクト自身に作用させる「仕掛け」をファンクタと呼びます。
簡単な例としては「食パンを焼く」です。ここで「食パン」がインスタンス化されたオブジェクトです。
そこで、ただ焼くのではなく猫の顔でも浮かび上がるようにしたいと考えます。
方法としては「2通り」が思い浮かびますね。
1:トースター自体を改造して、そのように焼けるようにする。
非常に面倒です。焼く側の改造なので大掛かりですね。そして、これが「関数」になります。
2:食パン自体に、焼かれると猫の顔が浮かぶように仕掛ける。
これが簡単ですね。オブジェクト自身で変化するため、こちらは「ファンクタ」になります。
プログラムでは、オブジェクトに「任意の型」が来たときの作用を記述することができます。
bitcoinではoperator()()が多いです。
operator()がファンクタを意味しまして、さらに()です。つまり、引数なしの場合の作用を書け、になります。

operator()()を持つオブジェクトを投げて登録し、キューが実行

コードの方は、キューがオブジェクトを取り出して、そのオブジェクトに()を与えていました。
operator()()は、thisポインタを使えますし、自由に記述できます。任意の実行が可能になりますね。
これと似た考えに「関数ポインタを渡す」があります。
でも……関数ポインタだとthisポインタがありません。this_callのポインタを渡そうとしても勿論エラーです。
オブジェクトで関数ポインタは使えません。そのためのファンクタ、でした。

□ 本ページをご覧いただきました方は、以下のページもよくご覧いただいております。
■ 集計中.....