2016-04-01 3 views
2

Это первый раз, когда я использую decltype, и я не совсем уверен, использую ли я его правильно. Код компилируется и, похоже, работает для POD, как char и int.std :: vector <decltype (iter)> - действительное использование decltype?

Я, однако, задаюсь вопросом, могу ли я столкнуться с проблемами с более сложными типами данных. Я был предупрежден другими, что такие вещи, как auto и decltype, могут быстро получить непреднамеренные результаты.

Мое предположение, что этот шаблон будет работать для любого типа T, имеющего оператор! = Определенный. Есть ли какие-то случаи, о которых я должен беспокоиться?

#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

Помнят, что это сделает вектор итераторов, а не вектор типа, на который ссылается итератор. В противном случае, да, это нормально. – OMGtechy

+0

В своем коде он, кажется, знает об этом – Maikel

+0

@OMGtechy: Да, я знаю об этом - мне это показалось хорошим решением. Я спрошу об этом в отдельном вопросе CodeReview. – Thomas

ответ

5

Да, нет проблем с этим использованием. Вы будете использовать std::vectorstd::forward_list::iterator, и поскольку эти итераторы отвечают требованиям к контейнерам, вам хорошо идти.

Смежные вопросы