(記事復旧のついでに少し修正)
msgpack-rpcのリクエストは、によると
[type, msgid, method, params]
という形式なのでmethod名をstd::stringとしてparamsをstd::tupleとして得られる。
これをサーバ側で如何に呼び出すかについて。
単純な実装だと以下のようにメソッド名をキーにして分岐することになる。
引数展開、関数呼び出し、結果のパッキングと一連の操作を定型処理として括りだすと下記のように書ける。
1引数関数から9引数くらいまでと返り値void版を作ってやればだいたいの関数を登録することができる。
さらに 関数の登録と実行を分けるべく次のように拡張した。
msgpack->引数展開->cpp関数呼び出し->msgpack
への一連の操作を 同一のシグネチャのstd::function
に 封じ込めることができる。
次にこれを関数ポインタ以外に関数オブジェクトを受け付けるように拡張したい。 まず、std::functionから実装。
呼び出し時に std::function
を経由するようにすればあらゆる関数呼び出しを登録できる。 例えば、ラムダ関数も以下のように登録できる。
しかし、どうせなら
と書きたい。
となると下記のような登録関数を書かねばならぬが関数のシグネチャがわからないので中身を記述することができない。
ここで関数オブジェクトのoperator()へのポインタを型推論することでFのシグネチャを得ることができる。
これでめでたくラムダも直接登録できるようになった。
ただし、operator()のオーバーロードが解決できないらしくstd::bindが登録できない。 std::bindに関しては、ラムダで代用できるしstd::functionでラップできるのでおいておくことにした。