私は std::functions を使用して、1 か所でのみ使用するまったく新しいクラスを宣言する必要がある仮想メンバーを作成する代わりに、クラスをより汎用的にしていますが、クラスをシリアル化するときに困惑しています。ランダムな C++ コードをシリアル化するというアイデアが機能しないことはわかっていますが、それは私が行う必要があることではありません。関数が同じバイナリの別の場所に既に存在することを知っているので、これを行う方法があるはずだと思います。gcc と MSVC で動作することをお勧めしますが、これを何らかの「ハッキー」な方法で行うことに反対しているわけではありません。
2 に答える
シリアル化できる一連の関数に ID または「ハンドル」をマップし、これを決定論的なコンパイル時の方法で行うと、ハンドルを整数型としてシリアル化できます。逆シリアル化/ロード時に、この決定論的マップを使用してハンドルを関連する関数ポインター型に変換し、そこから std::functions を構築できます。
これは、クラス内のポインターのシリアル化/逆シリアル化とそれほど違いはありません。通常、このスタイルの逆シリアル化は、POD 型の初期化と、2 番目のパスでのポインターの修正という 2 つのステップで構成されます。
std::function をそのパラメーターでシリアル化し、それらをファイルまたはネットワークにアーカイブして、マシンを再起動した後、またはより一般的には別のマシンで関数を (指定されたパラメーターで) 呼び出すことができます。 rpc を呼び出します。
以下に例を示します。
テストコード: https://github.com/galaxyeye/atlas/blob/master/libs/serialization/test/function.cpp 実装: https://github.com/galaxyeye/atlas/blob/master/atlas/シリアル化/関数.h
C++ の使いやすい RPC フレームワークについては、プログラマーがネイティブ関数のようにリモート関数を使用できるようにします。私の github でプロジェクト パイオニアを参照してください。
来週の月曜日までに終わらせます。
たとえば、クラスター内のすべてのマシンのプロセスを強制終了する場合は、マネージャー プログラムで次のように記述します。
multicast_client クライアント; client.call("pkill", pkill, "a_bad_process");
サーバー側プログラムが次のような関数を実装していると仮定します。 void pkill(const std::string& process_name);
希望が役立ちます:)