获取std :: stack后面的容器

时间:2016-04-14 11:05:57

标签: c++ c++11

我正在使用0来保存我的计划中的可能性列表。

9

现在,仅针对调试目的,我希望能够访问std::stack的所有元素(例如std::stack<int, std::deque<int> > myStack; )。但以下语法是非法的:

std::stack

最简单的方法是什么?

我这样做的方式是:

std::deque

但它看起来有点难看。

2 个答案:

答案 0 :(得分:7)

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;
}

答案 1 :(得分:1)

添加到Maxim的答案中(没有足够的评论意见):

std::stack没有虚拟析构函数,因此尝试从指向delete的基类指针中MyStack std::stack是不安全的。您可以决定相信在这种情况下编译器将生成警告,或者在大多数情况下使用私有继承来防止这种情况发生。

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
};