根据 C++ 标准,std::stack 包含一个名为 c 的容器的受保护成员变量。知道这一点并使用一点魔法,您可以通过指向该成员变量的指针来访问它。一旦您有权访问底层容器(默认为std::deque),您就可以访问包含的数据。
template<class T /* value type */, class C /* container */>
typename std::stack<T, C>::container_type& GetContainer(std::stack<T,C>& adapter)
{
struct AdapterAccessor : std::stack<T, C>
{
static std::stack<T, C>::container_type& Get(std::stack<T, C>& adapter)
{
return adapter.*&AdapterAccessor::c;
}
};
return AdapterAccessor::Get(adapter);
}
这是因为虽然AdapterAccessor 不能直接访问adapters 的内容,但它确实可以通过指向成员的指针进行间接访问。
您还可以使其与其他容器适配器一起使用。
template <template<class, class> class Adapter, class T, class... Args>
typename Adapter<T, Args...>::container_type&
GetContainer(Adapter<T, Args...>& adapter)
{
struct AdapterAccessor : Adapter<T, Args...>
{
static Adapter<T, Args...>::container_type& Get(Adapter<T, Args...>& adapter)
{
return adapter.*&AdapterAccessor::c;
}
};
return AdapterAccessor::Get(adapter);
}
示例用法:
int main()
{
std::stack<char> st;
st.push('1');
st.push('2');
st.push('3');
st.push('4');
auto& contents = GetContainer(st);
std::cout << contents[0] << std::endl;
std::cout << contents[3] << std::endl;
std::cout << contents[1] << std::endl;
std::cout << contents[2] << std::endl;
}