単純なfor (const auto& item : collection)
スタイルの逆順で、コレクションを繰り返し処理できるようにしたいと考えていました(これはベクトル上でのみ行います)。 :https://stackoverflow.com/a/28139075/2195721。しかし、その後、私は前方または後方のいずれかを反復処理できるようにしたかったので、ここで示したように、私は、コードを変更:入れ替え可能な前後方向の範囲指定イテレータの作成
#include <iterator>
#include <iostream>
#include <vector>
template <typename T>
struct reversable_wrapper {
T& iterable;
bool reverse;
reversable_wrapper(T&& iterable) : reversable_wrapper(iterable, true) {};
reversable_wrapper(T&& iterable, bool reverse) : iterable(iterable), reverse(reverse) {};
};
template <typename T>
auto std::begin (reversable_wrapper<T> w)
{
if (w.reverse) return std::rbegin(w.iterable);
else return std::begin(w.iterable);
}
template <typename T>
auto std::end (reversable_wrapper<T> w)
{
if (w.reverse) return std::rend(w.iterable);
else return std::end(w.iterable);
}
template <typename T>
reversable_wrapper<T> reverse (T&& iterable) { return reversable_wrapper<T>(iterable); }
template <typename T>
reversable_wrapper<T> forward (T&& iterable) { return reversable_wrapper<T>(iterable, false); }
int main()
{
std::vector<int> vec = {1,2,3};
for (const auto& i : reverse(vec)) std::cout<<i<<std::endl;
return 0;
}
基本的に、私が達成したいことはfor (const auto& item : cond ? forward(coll) : reverse(coll))
ました。しかし、このコードは、エラーの次に私を与える:
> $ g++ -std=c++14 iterators.cpp -o iterators
iterators.cpp: In instantiation of ‘auto std::begin(reversable_wrapper<T>) [with T = std::vector<int>&]’:
iterators.cpp:37:37: required from here
iterators.cpp:18:38: error: inconsistent deduction for ‘auto’: ‘std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >’ and then ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’
else return std::begin(w.iterable);
^
iterators.cpp: In instantiation of ‘auto std::end(reversable_wrapper<T>) [with T = std::vector<int>&]’:
iterators.cpp:37:37: required from here
iterators.cpp:25:36: error: inconsistent deduction for ‘auto’: ‘std::reverse_iterator<__gnu_cxx::__normal_iterator<int*, std::vector<int> > >’ and then ‘__gnu_cxx::__normal_iterator<int*, std::vector<int> >’
else return std::end(w.iterable);
私はこれがすべてで可能であるならば、私はこれを克服するためにstd::begin
とstd::end
に与えることができた署名把握することはできません。
私はg ++ 5.4.0を使用しています。