2017-08-17 5 views
1

ベクトルをタイプ別にソートして検索したい(すべて同じベースから継承)。これまで私はタイプを比較するためにstd::type_indexを利用してきました。私のコードはタイプ別にベクトルを並べ替え、タイプ別に検索するまたは派生タイプ

bool compareType(Base* const& left, Base* const& right) 
{ 
    return std::type_index(typeid(*left)) < std::type_index(typeid(*right)); 
} 

std::vector<Base*> m_list; 

template <typename T> 
T* search() 
{ 
    T example; 
    auto it = std::lower_bound(m_list.begin(), m_list.end(), &example, compareType); 
    if(it != m_list.end()) 
    { 
     return dynamic_cast<T*>(*it); 
    } 
    return nullptr; 
} 

のように見えるこれは、これまでうまく働いたが、私は今、私の検索方法でも、それは探していますし、私はどのようについて行くには見当もつかない1つに由来している任意の型を返すようにしたいです。 Baseが多型である

class Base {}; 
class DerivedA : public Base {}; 
class DerivedA1 : public DerivedA {}; 
class DerivedA1I : public DerivedA1 {}; 

// Calling this looks for a DerivedA, but can also return a DerivedA1 OR DerivedA1I 
DerivedA* result = search<DerivedA>(); 
+1

[ 'のstd :: is_base_of'](http://en.cppreference.com/w/cpp/types/is_base_ofを)あなたを助けるかもしれない。 – NathanOliver

+0

@ NathanOliverは 'std :: is_base_of'はC++ 11ですか?あるいは、すでにC++ 11を共通の標準と考えていますか? (私は私が知っている... :) – user1810087

+0

@ user1810087ええ、C + + 11はかなり一般的でなければなりません。 C++タグは現行の標準(So C++ 14)を意味します。そうでないと指定しない限り、私は現在の標準のものをバックで使うことができます。 – NathanOliver

答えて

1

場合たとえば、あなたが行うことがあります。

std::vector<Base*> bases; 

auto it = std::find(bases.begin(), bases.end(), 
        [](const auto* base) { 
         return dynamic_cast<const DerivedA*>(base) != nullptr; 
        }); 
関連する問題