ファンクター(関数ポインター)のリストのようなものを作成します。次に、それらをバイナリ形式でファイルに書き込みます。問題は、ファンクターが単純な関数ポインターであることです。(間違っていたら訂正してください。)しかし、関数のアドレスは実行ごとに異なります。
それで、質問 - 常に関連するファンクターのリストを作成する方法はありますか?
一方に識別子、もう一方に関数ポインタを持つある種の対になったデータ構造をお勧めします。マップのようなものが十分にある場合:
typedef void (*fptr_t)(); // or whatever your function pointer type is
std::map<std::string, fptr_t> fptr_map;
アプリケーションは、最初に必要になったときにこのマップを作成し、結果をキャッシュする必要があります。次に、関数ポインターをファイルに「書き込む」ときは、代わりに一意の std::string キーを書き込む必要があります。アプリケーションが関数ポインターを「読み取る」場合、キーを読み取り、それらをプログラムのその呼び出しの関数ポインターにマップします。
@fbreretoが言及しているように、考えられる解決策の1つは、特定のプロセスごとのアドレスに依存しない一意の識別子(整数、文字列、uuidなど)でさまざまなファンクターにラベルを付け、これらのキーをファイルに保存することです。次に、Factory Design パターンを使用して、ファイルの読み取り時に必要に応じてファンクターをインスタンス化できます。
はい、関数ポインタは単なるアドレスです。あなたはそれに頼ることはできません。代わりに、ファンクターの配列を作成し、ファンクターのインデックスをファイルに保存できます。または、ハッシュテーブルを作成し、ファンクターを名前で参照することもできます。