簡體   English   中英

在 std::stack 后面獲取容器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM