我在C ++中有一个模板化的Queue类,带有出队函数
template <typename el>
class Queue {
public:
...
el dequeue();
...
private:
...
};
出队功能定义为
template <typename el>
el Queue<el>::dequeue() {
if(isEmpty()) {
std::cout<<"The queue appears to be empty"<<std::endl;
// What should I return here ?
} else {
...
}
}
如果我有一个非模板化的类或者说一个只处理整数的简单队列,我可以返回一个像-1或者其他东西的值,并停止执行dequeue函数。在这种情况下我应该怎么做,因为el可以是结构,对象或原始数据类型。
答案 0 :(得分:2)
您最好的选择就是抛出异常。这表示发生了错误,客户端代码可以做出相应的反应。
另一种可能性是return el{};
默认构造el
。当然,这需要el
是默认构造的,这可能是也可能不是你的合理约束。但是,这会将客户端代码的责任放在进行大小验证上,以便它可以区分空dequeue
上的Queue
和等于默认构造el
的有效返回值。
答案 1 :(得分:1)
添加TartanLlama所说的内容: starndard库将迭代器返回给结果。您可以将iterator视为用于遍历容器的包装指针。 当你没有好东西返回时 - 你会在最后一个元素之后返回一个指向(不存在的)指针。
在您的示例中,如果Queue
已完成练习,您可以返回el*
而不是el
作为dequeue
的返回类型并返回nullptr
如果你没有好东西可以回来。
您也可以考虑实施Optional
课程
Optional
背后的想法是有一个包装类,可能包含也可能不包含结果。您实现bool
运算符以检查对象是否实际包含有效值。这样一个类的骨架可能看起来像:
template <class T>
class Optional{
T* m_optional;
public:
Optional(T* t);
Optional(T& t);
T* operator -> ();
operator bool() const;
};
然后从Optional<el>
Queue
当然,在真实代码上,只需使用std::queue