我已经写了一个模板化的容器类,它接受模板参数的类型和模板。
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;如果容器是字符串,则返回""/null;如果容器是浮点型,则返回0.0……差不多吧。
发布于 2018-06-03 01:39:28
@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是一个坏主意--非常令人困惑!
发布于 2018-06-03 01:31:06
处理它的一种方法是抛出一个异常。
if (count < 0)
{
throw std::out_of_range("stack1 is empty");
}
我强烈反对使用std::cout
将消息打印到该位置的终端。在数据结构的实现中使用std::cout
是一种糟糕的编程实践。
https://stackoverflow.com/questions/50659424
复制相似问题