1

実行時チェック操作について質問があります。クラスに次のような(純粋に仮想である)vectorから派生したオブジェクトが含まれている場合:BPAbstractBPAbstract

typedef std::shared_ptr<BPAbstract> Ptr;
std::vector<BPAbstract::Ptr> objects_;

ここで、特定のタイプのオブジェクトをvector.

template<class T>
void
GetObjectsByType( std::vector<typename T::Ptr> list ) const
{
    for( BPAbstract::Ptr i : objects_ )
    {
        // ???? ....
    }
}

最良の実装は何でしょうか? i1 つの解決策は、型にキャストしようとするTことです。結果が null でない場合は、それを list に追加できますlist。誰かがより良い解決策を知っていると確信しています...

アイデアのより良い実装の提案も受け入れられます!

4

2 に答える 2

3

動的ポインターキャストが必要です あなたの質問にはすでに回答があります

template<class T>
void
GetObjectsByType( std::vector<typename T::Ptr> list ) const
{
    for( BPAbstract::Ptr i : objects_ )
    {
        T::Ptr candidate = std::dynamic_pointer_cast<T>(i);
        if (candidate)
            list.add(candidate);
    }
}
于 2013-10-23T16:03:01.610 に答える