4

各ノードが基本的に次のように見えるツリーがあります。

struct node
{
    std::unordered_set<object*> objects;
    std::map<std::type_index,node> children;
};

ツリーを反復処理して新しいタイプを追加するとき、チェックを行いたい:

std::is_base_of<base,derived>

ただし、派生型について私が持っている唯一の情報はtype_index/type_info*.

とにかく引数type_info*に変換できるものはありますか?template

そうでない場合、他にどのような選択肢がありますか? を呼び出すことができると思いますdecltype(*objects.begin())が、それにはすべてのノードの各セットが空にならないようにする必要があります。

4

3 に答える 3

7

type_info*をテンプレート引数に変換できる方法はありますか?

いいえ、仕方がありません。テンプレートはコンパイル時のもので、RTTI は実行時のものです。2つの間に接続はありません。

を呼び出すことができると思いますdecltype(*objects.begin())が、それにはすべてのノードの各セットが空にならないようにする必要があります。

それは必要ありません。decltype引数を評価しません-する必要はありません。タイプを確認するだけです。式は評価されないため、UB を呼び出さなくても問題ありません。decltype(*a_null_pointer)これは、いわゆるunevaluated contextです。sizeof同じカテゴリーに属します。

ただし、これはあまり役に立たないことに注意してください-object*&戻ってくるだけです. 通常、最初にマッピングを準備しないと、ランタイム情報から型を取得できません。

于 2013-04-05T11:44:56.630 に答える
4

is_base_ofdecltype純粋にコンパイル時の構成要素です。オブジェクトの動的タイプは反映されません。

type_infoサブクラスの関係をチェックする機能を提供しません。実行時にそのチェックを実行する唯一の方法は、を使用することdynamic_castです。を格納して、派生型unique_ptr<base>にできるかどうかを確認する必要があります。dynamic_cast

于 2013-04-05T11:51:57.810 に答える