問題タブ [boost-any]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 機能を利用したイベントシステム良いアイデア?
次のようなモジュールシステムを作成しました。
本当にシンプルでわかりやすい。最初の欠点は「remove_event」がないことですが、(必要な場合) それを許可するには、呼び出し時にハンドラーを削除する std::function (set_event メソッドで) を返すことができます。イベント、返されたハンドラーを呼び出すだけです:
しかし、これが良いデザインなのか気になります。それとも、私のアプローチを使用して非常に大きな欠点を突然発見し、ほとんどのコードを書き直す必要がありますか? 「trigger_event」メソッドもモジュール間のメッセージ システムとして使用されると言えます。これは、JavaScript ライブラリの jQuery メソッド「bind」が許可するのと同じです。例:
ほとんどの場合、これは受け入れられる設計ですか? 非常に柔軟なアプローチが必要なので、boost::any を使用するのが私の考えですが、これは一般的に良い考え (スケーラブル、パフォーマンス、柔軟性) ですか?
c++ - 「あらゆる種類のデータ」をC++の関数に渡すにはどうすればよいですか。
stringhandler、SomeTypeHandler、AnotherTypeHandlerなどのサブクラスを持つクラスハンドラーがあるとします。クラスHandlerは、メソッド「handle」をすべてのサブクラスの共通インターフェースとして定義します。もちろん、「処理」するロジックは、ハンドラーごとに完全に異なります。
だから私がする必要があるのは、handleメソッドに何かの値を渡すことです。特定のクラスは、「何でも」を期待するタイプにキャストできます。
基本的に私が必要としているのは、JavaクラスObject:Dのようなものです。
私が最初に試したのはでしたvoid*
が、どうやらあなたはできないのでB* someB = dynamic_cast<B*>(theVoidPointer)
、そこには運がありません。
私の2番目のアイデアはを使用することでしたboost::any
。ただし、boost :: anyを使用するための要件は、値がコピーで構造化可能でなければならないことです。これは、私のデータには当てはまりません。
これを機能させるためのアイデアはありますか?
ありがとう
編集:メンバーがまったくないSomeDataクラスを使用して、データをそのサブクラスにすることができることはわかっていますが、独自のラッパークラスを作成する必要のないより一般的なアプローチを探しています。
c++ - 任意の型のマッピング ベクトル
それぞれが文字列識別子によって参照される、さまざまなタイプのリスト ベクトルを格納する必要があります。今のところ、キーと値としてstd::map
withを使用しています (実装例はこちらに掲載されています)。std::string
boost::any
保存されているすべてのベクトルでメソッドを実行しようとすると、スタックがなくなりました。たとえば、次のようになります。
私の質問:
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
ため、上記の質問があります。
私は提案を受け入れます。なにか提案を。
c++ - ブーストできます::any_cast(any&) スピードアップしますか?
boost::any_cast<T>(any&)
キャストが有効であることを確認するために、高価な型チェックを呼び出す呼び出しのように見えます。具体的には、次のテストを呼び出して、キャストが正当であることを確認します。
std::strcmp(operand->type().name(), typeid(ValueType).name()) == 0
キャストが正当な場合、コードは static_cast を実行します。
これはデバッグ モードでは便利なようですが、プロダクション コードではかなり遅くなります。strcmp をスキップする方法はありますか?
c++ - 「(const boost::any& a)」の代わりに「(boost::any a)」を使用して、参照間の参照を防止します
最初に、新しい関数オブジェクト、contains_t の定義が来ます。ヘルパー クラス std::unary_function (正しい typedef の作成を容易にすることを目的とした C++ 標準ライブラリの一部) から継承し、引数と結果の型を自動的に定義することもできますが、明確にするために、必要な typedef は次のとおりです。明示的に提供されます。引数の型が const boost::any& から boost::any に変更され、不正な参照から参照への潜在的な可能性を回避しました。実装は前と同じですが、ここでは関数呼び出し演算子に配置されています。
次の実装が参照間を受け取る可能性があるのはなぜですか?
ありがとうございました
c++ - 異なる型変数を返す単一のgetメソッド
std :: mapで正しい変数を見つけて返すために、std::stringを受け取る単一のgettemplateメソッドを持つクラスを作成したいと思います。
std :: mapは任意のタイプの変数を格納する必要があるため、boost :: anyを使用しました。これまでのところ、std::mapは次のようになっています。
get関数については、次のようなものを試しました。
しかし、幸運なことではありません、私の質問は、それも可能ですか?もしそうなら、どのように?
基本的な考え方は、クラス内のすべての特定の変数に特定のメソッドを作成したくないので、他のクラスはそのすべてのgetメソッドについて知る必要がないということです。
ありがとう!
ps:なぜこれが欲しいのかと尋ねる人のために、ここに履歴書があります。私にはたくさんのアルゴリズムがあり、特定の順序で実行され、最後に実行されたアルゴリズムにそれを使用します。だから、私が欲しいのは、どのアルゴリズムが実行されるか、どの順序で、どのデータを別のアルゴリズムから使用するかを示すxmlファイルを作成することです。
したがって、たとえば、アルゴリズムAには「threshold」という名前の変数があり、アルゴリズムBはその情報を必要とするため、通常はA.getThresholdなどを使用してAに問い合わせる必要がありますが、私が知る限り、 (xmlファイルから)文字列内の名前でオブジェクト関数を呼び出すので、私のソリューションには、必要な変数名を渡すget関数のみが含まれ、その関数はそれを返します。
c++ - boost::any はコピーまたは参照/ポインタを保存しますか?
次のコードは安全ですか?
c++ - boost::any の内容への void* ポインターを取得する
void* を受け入れるメソッドを持つ外部ライブラリを使用しています
この void* が、boost::any オブジェクト内に含まれるオブジェクトを指すようにします。
boost::any オブジェクトのコンテンツのアドレスを取得することは可能ですか?
myAny.content で遊ぼうとしていますが、今のところうまくいきません! dynamic_cast または unsafe_any_cast の組み合わせで必要なものが得られることを願っています。
ありがとう!
c++ - boost::property_tree に boost::any を追加することは可能ですか?
boost::any タイプをブースト プロパティ ツリーに格納しようとしています。実行可能な例を次に示します。
おそらく同じ理由で、boost::any はシリアライズ可能ではありません。しかし、クエリが許可されていることがわかりますanyVar.type()
が、それで何ができるかわかりません。ここで固定数の既知の型を明示的にコーディングせずに、プロパティツリーにデータを追加するために何らかの方法で使用することは可能auto
ですか? C++11/C++0x メソッドも大歓迎です。
これは私が得るエラーです:
c++ - 「double*」を「boost::any*」に変換します
可変boost::any*
アイテムがあります。私の要件は次のとおりです。
int、double、またはその他のデータ型の値のリストを持つアイテムを割り当てます。ただし、特定の時点でデータ型は一意になります。
問題:
単一の値の場合、items[index] = value; を使用して割り当てることができます。しかし、アイテム=値を実行すると; ここで、values は double 配列であり、自動的にキャストできません。また、私が使用する場合
'boost::bad_any_cast': failed conversion using 'boost::any_cast` を受け取りました。
double 配列を配列にキャストする方法について、いくつかのヒントが非常にboost::any
役立ちます。