mbed OS5 の Callback

mbed OS2 までは、引数に関数を受け取る場合、FunctionPointerArg1<戻り値, 引数> を使って抽象化していた。mbed OS 5 では Callback を使う。

mbed OS 5.1 からこの Callback 型を使わず、既存のAPIで関数を引数として渡すと非推奨の warning が出る。

Callback

mbed のレポジトリで

git grep Callback\<|grep Callback.h

すると定義が山ほど出てくるけど、よく使うのは

Callback<戻り値型(呼び出す関数の引数)> cb = callback(関数ポインタ);
Callback<戻り値型(呼び出す関数の引数)> cb = callback(オブジェクトへのポインタ、そのオブジェクトの関数ポインタ);

あたり。

例えば数値の2乗を返す関数を Callback 型にしたいときは、callback() をつかう。

#include <math.h>
uint16_t pow2(uint8_t n) {
    return pow(n, 2);
}

Callback<uint16_t(uint8_t)> callbackPow2 = callback(&pow2);
callbackPow2(10);
callbackPow2.call(10);

Callback 型は ()演算子オーバーロードしてるので、関数呼び出しのように書くこともできるし、明示的に call() で呼び出すことも出来る。

また、もちろんオブジェクトとそのオブジェクトが持つ関数のバインドにもよく使う。

Callback<R(A0)> cb = callback(&objFoo, &Foo::func);