4

それぞれが文字列識別子によって参照される、さまざまなタイプのリスト ベクトルを格納する必要があります。今のところ、キーと値としてstd::mapwithを使用しています (実装例はこちらに掲載されています)。std::stringboost::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ため、上記の質問があります。

私は提案を受け入れます。なにか提案を。

4

1 に答える 1

0

追加された詳細を見て、すぐに反応したのは、型をテンプレート パラメーターとして使用して、データをいくつかの個別のマップに分割することでした。たとえば、 と を次のようにget_int("scale")置き換えget<int>("scale")ますset_double("x", 0.2)set<double>("x", 0.2);

または、 を使用して、(一例として) orstd::mapのようなものに簡単に変更できます(後者には少し注意する必要があるかもしれませんが、存在しない値を取得しようとすると、デフォルトで作成されます)。エラーを通知するのではなく、初期化します)。doubles["x"] = 0.2;int scale_factor = ints["scale"];

いずれにせよ、さまざまな種類のコレクションを 1 つの大きなコレクションにまとめようとするのではなく、それぞれが均質な多数の個別のコレクションになってしまいます。

それらを1つの全体的なコレクションにまとめる必要がある場合は、構造体を使用するだけで十分だと思うので、次のようになりvals.doubles["x"] = 0.2;ますint scale_factor = vals.ints["scale"];

少なくとも率直に言えば、これで何かが失われることはないと思います。また、静的型付けを一貫して保持することで、C++ が意図する動作に確実にうまく適合しているように見えます。

于 2012-05-03T17:56:02.527 に答える