在c ++中实现泛型堆栈

时间:2016-02-23 12:14:21

标签: c++ generics boost stl stack

我正在使用STL和boost库来实现通用堆栈数据结构。

#include <iostream>
#include <cstdio>
#include <stack>
#include <boost/any.hpp>
#include <boost/type_index.hpp>

using namespace std;

class Stack{
    private:
        std::stack<boost::any> st;
    public:
        bool empty();
        int size();
        boost::any top();
        void push(boost::any ele);
        void pop();
};

bool Stack::empty(){
    return st.empty();
}

int Stack::size(){
    return st.size();
}

boost::any Stack::top(){
    return st.top();
}

void Stack::push(boost::any e){
    st.push(e);
}

void Stack::pop(){
    st.pop();
}

int main(){
    Stack st;
    int a = 10;
    st.push(a);
    int b = boost::any_cast<int>(st.top());
    float c = 10.0;
    st.push(c);

}

虽然它工作正常但我想在从堆栈中检索项目时避免显式类型转换。我希望以某种方式堆栈应该根据项目的类型自动进行类型转换后返回项目。

我打算用堆栈维护一个hashmap,它可以存储每个元素的类型信息,并且可以在返回之前用于对每个项目进行类型转换,但是我无法将其写为代码。请给我一些可能的方法。

1 个答案:

答案 0 :(得分:4)

您无法自动转换为正确的类型;那么top()函数的返回类型将取决于运行时发生的任何事情。那么,在编译时你会给你的top()函数返回什么样的返回类型?你能做的最好就是

template <typename T>
T top()
{
  return boost::any_cast<T>(stack.top());
}

编辑:至于你的评论 - 不,你不能使用auto返回类型来获得你希望的行为,因为编译器会推断出auto所代表的类型< em>在编译时 - 它会推断出你返回的内容:boost::any。任何更具体的东西只能在运行时知道。