それぞれが文字列識別子によって参照される、さまざまなタイプのリスト ベクトルを格納する必要があります。今のところ、キーと値としてstd::map
withを使用しています (実装例はこちらに掲載されています)。std::string
boost::any
保存されているすべてのベクトルでメソッドを実行しようとすると、スタックがなくなりました。たとえば、次のようになります。
std::map<std::string, boost::any>::iterator it;
for (it = map_.begin(); it != map_.end(); ++it) {
it->second.reserve(100); // FAIL: refers to boost::any not std::vector
}
私の質問:
boost::any
メソッドを実行できるように、任意のベクター型にキャストすることはできますか?- 任意の型のベクトルをマップし、後で正しい型で取得するより良い方法はありますか?
現在、この回答boost::any
で提案されているように、基本コンテナー クラスへのポインターに置き換える代替実装をいじっています。これにより、解決する必要がある他の問題を伴うまったく新しいワームの缶が開かれます。必要に応じてこのルートを進んでいきますが、他のより良い解決策があるかどうか、で動作させることができるかどうかを知りたいと思っています.boost::any
PS 私は C++ n00bの初心者です (そして、Python の動的型付けにあまりにも長い間甘やかされてきました) ので、これについて間違った方法で行っている可能性があります。厳しい批判 (理想的にはその後の提案) は大歓迎です。
大きな絵:
コメントで指摘されているように、これは XY の問題である可能性が高いため、私が達成しようとしていることの概要を次に示します。
タスクの実行を管理するシミュレーション フレームワーク用のタスク スケジューラを作成しています。各タスクは、一連のデータ ベクトルに対する要素操作です。たとえば、task_A
がモデルで操作として定義されている場合、"x"(double), "y"(double), "scale"(int)
効果的にエミュレートしようとしているのは、task_A(double x[i], double y[i], int scale[i])
のすべての値に対するの実行ですi
。
すべてのタスク (関数) はデータの異なるサブセットで動作するため、これらの関数は共通の関数シグネチャを共有し、特定の API (例:get_int("scale")
およびset_double("x", 0.2)
.
以前のフレームワーク (C で記述) では、タスクが静的にスケジュールされ、フレームワークが特定のモデルに基づいてコードを生成し、シミュレーションを実行していました。タスクの順序は、モデル定義から抽出された依存関係グラフに基づいています。
現在、依存関係が満たされたときにタスクを実行するランタイム スケジューラを使用して、すべてのモデルに共通のランタイムを作成しようとしています。モデル固有のコードの生成から汎用コードの生成への移行は、あらゆる種類の苦痛をもたらしました。基本的に、異種ベクトルを一般的に処理し、「名前」(およびおそらく )でアクセスできる必要があるtype_info
ため、上記の質問があります。
私は提案を受け入れます。なにか提案を。