0

現在の状態を定期的に (Manager::checkout() が呼び出されたときに) 保存する C++ の datamanager フレームワークを試しています。これは、システム エラー後にアプリケーションを再起動できるようにするシステムの基盤となります。

アイデアは、すべての変数を保持する Manager と呼ばれるシングルトン クラスを持つことです。ユーザーは、次のようにして新しい管理変数を簡単に作成できます。

int& i = Manager::get().make<int>("variable_id");
double& e = Manager::get().make<double>("other_variable_id");

私の問題は、マネージャーの観点から変数を管理する方法です。

私の最初のアイデアは、変数と、変数のシリアル化/管理のためのメソッドを保持する変数型によってテンプレート化されたオブジェクト クラスを構築することでした。

それでも私はそれらの多くを持っていた場合

Object<char>, Object<double>, Object<std::vector<int>>

すべてにキャスト

Object<void>

そして、

std::map<std::string, Object<void>>

それらのオブジェクトと対話する方法がわかりません (マネージャーは基になる型を知らないため)。タイプを Object の要素として保存することはできません (残念ながら、C++ ではタイプはオブジェクトではありません)。シリアライゼーション部分以外に保存できるものと保存できないものに制限を課さないために、列挙型を使用したくありません。

どのように私はそれを行うことができますか?

4

1 に答える 1

0

「シングルトン データ マネージャー」というのはひどいアイデアのように聞こえるという事実 (「データ マネージャー」は、おそらく私が想像できるクラスの最悪の名前です)は別として、必要な型消去の種類は、次の 1 つの重要な条件に大きく基づいています。

事前にすべてのタイプを知っていますか?

  • わかっている場合は、variant(Boost には実装があります) と提案された訪問者パターンを使用してください。

  • そうでない場合は、 をご覧くださいany

いずれにせよ、基本的な考え方は、型が消去されたポインターに、その実行時の型を示すで注釈を付けることです。C++ はそれを行います (これを RTTI と呼んでいます) が、あなたの場合はおそらく手動で行う方がよいでしょう。

于 2014-09-26T13:35:50.787 に答える