2016-04-14 8 views
2

std::stackを使用して、プログラムの可能性のリストを保持しています。std :: stackの背後にあるコンテナを取得します。

std::stack<int, std::deque<int> > myStack; 

は今、デバッグ目的のみのために、私は私のstd::stackstd::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(); 
} 

が、それは少し醜いです。

答えて

6

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

それは 'protected'メンバーですので、何のことは「アクセス」ではありませんありません。あなたが必死ならば、あなたはそれをハックすることができます。 –

関連する問題