3

反復可能なコンテナーを「ラップ」するためのオブジェクトである短いユーティリティ関数を作成して、範囲ベースの を使用して逆方向に移動できるようにしましたfor

template <typename Iterable>
struct ReverseWrapper {
private:
  Iterable& m_iterable;

public:
  ReverseWrapper(Iterable& iterable) : m_iterable(iterable) {}

  auto begin() const ->decltype(m_iterable.rbegin()) {
    return m_iterable.rbegin();
  }

  auto end() const ->decltype(m_iterable.rend()) {
    return m_iterable.rend();
  }
};

template <typename Iterable>
ReverseWrapper<Iterable> reverseIterate(Iterable& list) {
  return ReverseWrapper<Iterable>(list);
}

これは、C++ 反復可能オブジェクトでは機能しますが、静的配列では機能しません。オブジェクトが範囲ベースを使用した反復をサポートするには何が必要ですforか? この問題にアプローチする最善の方法は何でしょうか?

4

2 に答える 2

2

コードでは、Iterableテンプレート パラメーターにbeginおよびendメンバー関数が必要です。通常の C++ 配列には、これらの関数はありません。代わりに、C++11 標準の一部であるstd::beginとを使用する必要があります。std::end

std::rbeginただし、 or関数はないようですstd::rend。つまり、それらを自分で実装する必要があり、実際のイテレータ クラスも実装する必要があります。

于 2012-07-20T14:09:43.557 に答える