我正在使用0
来保存我的计划中的可能性列表。
9
现在,仅针对调试目的,我希望能够访问std::stack
的所有元素(例如std::stack<int, std::deque<int> > myStack;
)。但以下语法是非法的:
std::stack
最简单的方法是什么?
我这样做的方式是:
std::deque
但它看起来有点难看。
答案 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
};