Это первый раз, когда я использую 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;
}
Помнят, что это сделает вектор итераторов, а не вектор типа, на который ссылается итератор. В противном случае, да, это нормально. – OMGtechy
В своем коде он, кажется, знает об этом – Maikel
@OMGtechy: Да, я знаю об этом - мне это показалось хорошим решением. Я спрошу об этом в отдельном вопросе CodeReview. – Thomas