2016-04-01 3 views
2

decltypeを初めて使用しています。私はそれを正しく使用しているかどうかは不明です。コードはコンパイルされ、charやintのようなPODで動作するようです。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です。これらのイテレーターはコンテナ要件を満たしているので、あなたはうまくいきます。