2016-04-01 4 views
2

Dies ist das erste Mal, dass ich declltype verwende, und ich bin nicht ganz sicher, ob ich es richtig benutze. Der Code kompiliert und scheint für POD wie char und int zu funktionieren.Std :: Vector <Dekltyp (Iter)> - gültige Verwendung von Dekltyp?

Ich frage mich jedoch, ob ich irgendwelche Probleme mit komplexeren Datentypen stoßen könnte - ich wurde von anderen gewarnt, dass Dinge wie auto und declltype schnell unbeabsichtigte Ergebnisse bekommen können.

Meine Annahme ist, dass diese Vorlage für jeden Typ T funktionieren würde, der den Operator! = Definiert hat. Gibt es irgendwelche Randfälle, über die ich besorgt sein sollte?

#include <forward_list> 
#include <iostream> 
#include <cstdlib> 
#include <vector> 

template<typename T> 
bool isPalindrome(const std::forward_list<T>& lf) 
{ 
    auto iter = lf.begin(); 
    std::vector<decltype(iter)> bv; // <-- Correct usage? 

    while(iter!= lf.end()) 
    { bv.push_back(iter++); } 

    int istop = bv.size()/2 + bv.size()%2; 
    iter = lf.begin(); 

    for(int i = bv.size()-1; i>=istop; i--, iter++) 
    { if(*iter != *(bv[i])) return false; } 
    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    std::forward_list<int> list = {0,1,2,1,0}; 
    std::cout << "Is palindrome: " << isPalindrome(list) << std::endl; 
    return 1; 
} 
+0

In dem Bewusstsein, dass dies einen Vektor von Iteratoren ergibt, kein Vektor des Typs, auf den sich der Iterator bezieht. Ansonsten aber, ja, es ist in Ordnung. – OMGtechy

+0

In seinem Code scheint er davon zu wissen – Maikel

+0

@OMGtechy: Ja, ich bin mir dessen bewusst - es schien mir wie eine gute Lösung. Ich werde darüber in einer separaten Frage auf CodeReview fragen. – Thomas

Antwort

5

Ja, es gibt kein Problem mit dieser Verwendung. Sie werden std::vector von std::forward_list::iterator verwenden, und da diese Iteratoren Containeranforderungen erfüllen, sind Sie gut zu gehen.

Verwandte Themen