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

What to return when dequeue is called on an empty templated C++ Queue class

本文关键字:dequeue 调用 返回 Queue c++      更新时间:2023-10-16

我在c++中有一个模板化的Queue类,带有dequeue函数

template <typename el>
class Queue {
public: 
  ...
  el dequeue();
  ...
private: 
...
};

dequeue函数定义为

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 {
   ...
  }
}

如果我有一个非模板化的类,或者一个简单的Queue,只处理整数,我可以返回一个像-1之类的值,并停止执行dequeue函数。既然el可以是结构、对象或基本数据类型,那么我该怎么做呢?

你最好的选择是抛出一个异常。这表示发生了错误,客户端代码可以做出相应的反应。

另一种可能是将return el{};默认构造为el。当然,这需要el是默认可构造的,这对您来说可能是一个合理的约束,也可能不是。但是,这将责任放在客户端代码上进行大小验证,以便它能够区分空Queue上的dequeue和等于默认构造的el的有效返回之间的区别。

再补充一下TartanLlama说过的话:标准库对结果返回一个迭代器。你可以把迭代器想象成一个用来遍历容器的包装指针。当你没有什么好东西可返回时——在最后一个元素后面返回一个指向(不存在的)指针。

在你的例子中,如果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;
};

则从Queue返回Optional<el>

当然,在实际代码中,使用std::queue