2017-08-17 73 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; 
} 

這一直很好,到目前爲止,但我現在希望我的搜索方法也返回從一個它的搜索衍生的任何類型的,我不知道如何去說。例如

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

['標準:: 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

如果Base是多態的,你可以這樣做:

std::vector<Base*> bases; 

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