[英]Get container behind std::stack
我正在使用std::stack
來保留我的程序中的可能性列表。
std::stack<int, std::deque<int> > myStack;
現在,僅出於調試目的,我想訪問std::stack
所有元素(例如作為std::deque
)。 但以下語法是非法的:
std::deque<int> myDeque = myStack; // Does not compile
最簡單的方法是什么?
我會這樣做的方式是:
std::stack<int, std::deque<int> > newStack = myStack;
std::deque<int> myDeque;
while(!newStack.empty()){
myDeque.push_back(newStack.top());
newStack.pop();
}
但它看起來有點難看。
std::stack
的底層容器可作為受保護成員c
訪問。 因此:
template<class T, class C>
struct MyStack : std::stack<T, C>
{
typedef std::stack<T, C> Stack;
using Stack::Stack;
using Stack::operator=;
using Stack::c; // expose as public
};
如果您無法更改定義並重新編譯,則:
template<class T, class C>
C& get_underlying_container(std::stack<T, C>& s) {
static_assert(sizeof s == sizeof(MyStack<T, C>), "Size mismatch.");
static_assert(alignof s == alignof(MyStack<T, C>), "Alignment mismatch.");
return static_cast<MyStack<T, C>&>(s).c;
}
添加到Maxim的答案(沒有足夠的代表發表評論):
std::stack
沒有虛擬析構函數,因此嘗試從指向std::stack
的基類指針中delete
MyStack
是不安全的。 您可以決定相信您的編譯器會在這些情況下生成警告,或者在大多數情況下使用私有繼承來防止這種情況。
template<class T, class C>
struct MyStack : private std::stack<T, C>
{
typedef std::stack<T, C> Stack;
using Stack::Stack;
using Stack::operator=;
using Stack::c; // expose as public
// Private inheritance, explicitly forward functions we need
using Stack::size;
using Stack::push;
using Stack::pop;
// etc
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.