スタックとして使用する deque を持つクラスがあります (ベクトルである可能性があり、たまたま deque を選択しただけです)。
いずれにせよ、消費者がスタックの内容を繰り返し処理できるようにしたいと考えています (std::stack では実行できないことです)。現在、アイテムをスタックにプッシュするために push_back() を使用しているため、順方向にコンテンツを反復すると、スタックの一番下から一番上に移動します。
for (auto e: thestack) を使用したスタックの反復処理がトップダウン方式で機能するように、逆の順序で公開することをお勧めします。
新しい for ループ構文 (および範囲ベースのアルゴリズム) の反復順序を逆にするためのいくつかのソリューションを示す、C++11 の逆範囲ベースの for ループを見つけました。
私が不明なのは、ユーザーがこの自動的に反転された両端キューにアクセスできるようにするための単純なメカニズムを提供する方法です。
たとえば、本当の努力をしなくても、基礎となる両端キューへの const& アクセスを単純に許可できます。
const std::deque<T> & GetStack() const { return m_stack; }
消費者は逆転の責任を負う可能性があります。
for (auto e : reverse(m_toolstack.GetStack()))
ここでは、逆に次のソリューションを使用しようとしています。
template<class Fwd>
struct reverser_generic
{
Fwd &fwd;
reverser_generic(Fwd& fwd_): fwd(fwd_) {}
typedef std::reverse_iterator<typename Fwd::iterator> reverse_iterator;
reverse_iterator begin() { return reverse_iterator(std::end(fwd)); }
reverse_iterator end() { return reverse_iterator(std::begin(fwd)); }
};
template<class Fwd>
struct reverser_special
{
Fwd &fwd;
reverser_special(Fwd& fwd) : fwd(fwd) { }
auto begin() -> decltype(fwd.rbegin()) { return fwd.rbegin(); }
auto end() -> decltype(fwd.rend()) { return fwd.rend(); }
};
template<class Fwd>
auto reverse_impl(Fwd& fwd, long) -> decltype(reverser_generic<Fwd>(fwd))
{
return reverser_generic<Fwd>(fwd);
}
template<class Fwd>
auto reverse_impl(Fwd& fwd, int) -> decltype(fwd.rbegin(), reverser_special<Fwd>(fwd))
{
return reverser_special<Fwd>(fwd);
}
template<class Fwd>
auto reverse(Fwd&& fwd) -> decltype(reverse_impl(fwd,int(0)))
{
static_assert(!(std::is_rvalue_reference<Fwd&&>::value), "Cannot pass an rvalue reference to reverse()");
return reverse_impl(fwd,int(0));
}
上記のすべては、VS2012 を使用して正しくコンパイルおよび実行されます (そのソリューションについては、Jive Dadson などに感謝します)。
ただし、私のスタック ファサードでは、基になるコンテナーの逆を常に返すようにしたいのですが、賢明な方法でそうする方法がわかりません。
auto GetContents() const -> decltype(reverse(m_stack)) { return reverse(m_stack); }
上記のエラーは、m_stack が不明であることを示しています。this->m_stack も同様に不明です。
「それが何であれ、それが私のメンバーm_stackの逆である」を返すにはどうすればよいですか?
回答が得られたら、「reverse(m_stack) の decltype の const & を返すにはどうすればよいですか?