2016-08-08 109 views
1

Ich versuche, eine Vorlagefunktion zu schreiben, um wahr zurückzugeben, wenn ein bestimmtes Objekt bereits in einem Container vorhanden ist. Hier bin ich, und ich weiß nicht, wo ich von hier aus hingehen soll.Traverse Generic STL Container auf Existenz zu prüfen

template <typename BeginningIter, typename EndingIter, typename T> 
static bool itemExists(BeginningIter bit, EndingIter eit, const T &searchTerm) 
{ 
    if ((bit == nullptr) || (eit == nullptr)) { 
     return false; 
    } 
    static_assert(std::is_same<std::decay(decltype(*bit)), std::decay(searchTerm)>::value, "Invalid"); 
    for (auto iter = bit; iter != eit; iter++) { 
     if (*iter == searchTerm) { 
      return true; 
     } 
    } 
    return false; 
} 

ich aber auch versuchen std :: enable_if in der Vorlage Spezifikation Linie zu verwenden, aber ich wusste nicht, einen Weg, den Typ eines dereferenced BeginningIter Begriff zu bekommen. Ich habe den std :: decay für den Fall verwendet, dass er auf einen Referenztyp zeigt. Wenn jedoch zu kompilieren versuchen, erhalte ich

generalutilities.h: In static member function ‘static bool GeneralUtilities::itemExists(BeginningIter, EndingIter, const T&)’: 
generalutilities.h:148:77: error: template argument 1 is invalid 
     if (!std::is_same<std::decay(decltype(*bit)), std::decay(searchTerm)>::value) { 
                      ^
generalutilities.h:148:77: error: template argument 2 is invalid 
+2

"* Ich versuche, eine Vorlagefunktion zu schreiben, um wahr zurückzugeben, wenn ein bestimmtes Objekt bereits in einem Container vorhanden ist. *" FYI: Wir haben bereits eine davon. [Es heißt 'finden'] (http://en.cppreference.com/w/cpp/algorithm/find). Und es ist viel besser als Ihres, da es den Ort zurückgibt, an dem es gefunden wurde, und es ist nicht erforderlich, dass der Typ eines Elements im Container genau der Typ ist, nach dem Sie suchen. –

+2

Ja, ich weiß über finden. Ich versuche gerade, zehn Teller zu lernen. –

+0

'if (! Std :: is_same <...> :: Wert) {std :: cout <<" Nicht das gleiche "<< std :: endl; } 'Das sollte wahrscheinlich eine' static_assert' sein – KABoissonneault

Antwort

1
std::decay(decltype(*bit)) 

std::decay keine Funktion ist; es ist eine Metafunktion. IE: eine Struktur mit einem ::type Mitglied (oder ::value für Metafunktionen, die Werte ergeben). Und Sie können keine regulären Funktionen aufrufen, indem Sie einen Typ trotzdem übergeben.

Sie rufen eine Metafunktion mit typename std::decay<decltype(*bit)>::type. Der typename Teil ist ziemlich wichtig.

Pre-C++ 14, würden Sie Ihren Code kürzer, indem Sie eine schnelle Alias-Vorlage machen:

template<typename T> using decay_t = typename std::decay<T>::type; 

C++ 14 macht, dass ein Teil der Standardbibliothek für alle Art Metafunktionen.