myoukakuのブログ

C++でゲームエンジンを作っていきます。

std::functionをシリアライズできなくてつらい

例えばウィンドウがリサイズされたときの処理を設定するとき、

Window window;
window.on_resize() += [](int width, int height)
{ /* リサイズされたときの処理 */ };

のように書いて、Windowクラスのほうではstd::function(boost::function)で保持しようかと思っていました。 しかしそうするとWindowクラスをBoost.Serializationでシリアライズできなくなってしまいます。

フリー関数やラムダ関数をシリアライズするのは不可能なので*1、関数オブジェクトのインターフェースクラスを定義して、それを継承したクラスを用意するという、C++03時代の方法しかなさそうです。

つらい。

*1:少なくともポータブルな方法は無い