저는 스택으로 사용하는 deque를 가진 클래스를 가지고 있습니다 (그냥 deque를 선택했을 때 벡터가 될 수 있습니다).컨테이너를 포장하는 역전 된 어댑터를 어떻게 반환 할 수 있습니까?
필자는 소비자가 스택의 내용 (std :: stack에서 수행 할 수없는 것)을 반복 할 수 있기를 바랍니다. 나는 현재 push_back()을 사용하여 스택에 항목을 푸시합니다. 따라서 순방향 순서로 내용을 반복하는 경우 맨 아래에서 맨 위로 이동합니다.
역순으로 항목을 노출하여 for (auto e : thestack)를 사용하여 스택을 반복하는 것이 하향식으로 작동하도록하는 것이 좋습니다.
새로운 for 루프 구문 (범위 기반 알고리즘은 물론)에 대한 반복 순서를 뒤집을 수있는 몇 가지 해결책을 보여주는 C++11 reverse range-based for-loop이 있습니다.
내게 명확하지 않은 점은 내 사용자가 자동으로 뒤집힌 양키 (deque)에 액세스 할 수있게 해주는 간단한 방법을 제공하는 방법입니다.
const std::deque<T> & GetStack() const { return m_stack; }
소비자가 반전에 대한 책임 수 : 실제 노력없이, 단순히 기본 양단 큐에 const를 & 액세스를 허용 할 수 있습니다 여기에
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));
}
제대로 (자이브 Dadson 등 덕분에이 솔루션을..) VS2012를 사용하여 실행 : 반대합니다. ,
auto GetContents() const -> decltype(reverse(m_stack)) { return reverse(m_stack); }
위의 오류 :
는하지만, 내 스택 외관에, 정말 단순히 항상 기본 컨테이너의 역을 반환하려면,하지만 난 재치있는 방식으로이 작업을 수행하는 방법에 대한 불분명 해요 m_stack은 알 수 없음을 나타냅니다. this-> m_stack도 똑같이 알 수 없습니다.
"회원 m_stack의 반대편이 무엇이든간에"반환하는 방법은 무엇입니까? 이 답변하면
주, 나 또한 어떻게 역 (m_stack)의 decltype 무엇이든의 CONST &을 반환 할 "필요?
'decltype (reverse (std :: declval())) ' –
Xeo
대신 클래스에 맞는 반복자를 만들지 않겠습니까? –
네, 저 역시 저에게 일어났습니다. 게으름과 내가이 길을 걸어 왔음을 알게 된 어떤 완고함. :) – Mordachai