在空模板化C ++ Queue类上调用dequeue时要返回的内容

时间:2015-09-09 11:04:52

标签: c++ templates data-structures

我在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可以是结构,对象或原始数据类型。

2 个答案:

答案 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