0

私は持っていVector<ItemRenderer^>ます。ItemRenderer抽象型です。すべてをフィルタリングしてConcreteRenderer、何らかのアクションを実行したいと考えています。

私が試したこと:

for each (auto renderer in m_parts)
    if (renderer->GetType() == ConcreteRenderer::typeid)
    {
        auto item = dynamic_cast<ConcreteRenderer^>(renderer);
        item->SetState(1);
    }

しかしrenderer、タイプがVectorProxy<ItemRenderer^>あり、何も機能しません。修正方法は?

アップデート:

そこで、次のコードを使用しました。

for each (auto renderer in m_parts)
{
    auto item = dynamic_cast<ConcreteRenderer^>((ItemRenderer^)renderer);
    if (item != nullptr)
        item->SetState(1);
}

今、すべてがうまくいきます。それは一般的な解決策ですか、それとも他に何かありますか?

4

1 に答える 1

1

正しい解決策を見つけたようです(各要素について、動的キャストがターゲットタイプになり、動的キャストがnull以外を返す場合、要素は予期されたタイプです)。

p->GetType() == Thing::typeidこれらの式は両方とも。を返すため、試行したこと( )は機能しませんPlatform::Type^。これはハンドル/ポインタータイプであるため、ポインター比較を実行しています(ID比較ではありません)。これは基本的に、シナリオでは常にfalseを返します。

キャストする代わりに型IDを使用してこれを実行する場合は可能ですがFullName、型オブジェクトのプロパティの文字列比較を実行する必要があります。例:if (p->GetType()->FullName == Thing::typeid->FullName)

ただし、dynamic_castソリューションの方が一般的にパフォーマンス特性が優れていると思います。(特に、タイプが同じであることがわかった場合は、とにかくそのdynamic_castを実行する必要があるためです!)

于 2012-11-05T19:12:14.120 に答える