当堆栈为空时,在(模板化的)堆栈弹出方法中该怎么做?

时间:2018-06-02 17:25:16

标签: c++ templates error-handling stack api-design

我编写了一个模板化的容器类,它接受模板参数的类型和模板。

template<class type, template<typename...> class Seq>
class stack1
{
private:
    int count;
    int size;
    Seq<type> st;
    //Seq<string> str;

public:
    stack1(size_t size):size(100), count(-1){ }
    void push(type elem);
    type pop();

};


template<class type, template<typename...> class Seq>
type stack1<type, Seq>::pop()
{
    if (count < 0)
    {
        cout << "stack1 is empty," << endl;
        /*How to handle this condition.*/

    }
    else
    {
        type elem; 
        elem = st.back();
        st.pop_back();
        count--;
        return elem;
    }
}

我的问题是,在pop函数中,当容器对象为空时,我应该如何处理错误场景。我希望在这种情况下返回一些默认值, 例如0 / -1如果容器是int或“”/ null如果它是字符串或0.0如果它是浮点数......就像那样。

2 个答案:

答案 0 :(得分:3)

处理它的一种方法是抛出异常。

if (count < 0)
{
    throw std::out_of_range("stack1 is empty");
}

我强烈建议不要使用std::cout在该地点的终端上打印消息。在数据结构的实现中使用std::cout是一种糟糕的编程习惯。

答案 1 :(得分:3)

@ RSahu的建议是件好事。

另一种方法是改变pop()函数的签名:

type pop();

std::optional<type> pop();

如果堆栈为空则返回std::nullopt,或者通常情况下包装的值:

if (count < 0) {
    return std::nullopt;
}

请注意,std::optional是在C ++ 17语言标准中引入的;在C ++ 14中,您将其作为std::experimental::optional,或者您可以将boost::optional用于C ++ 11及更早版本。

PS:当元素数实际为0时,将count设为-1是个坏主意 - 非常混乱!