在空模板化的c++ Queue类上调用dequeue时返回的内容
What to return when dequeue is called on an empty templated C++ Queue class
我在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
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 在空模板化的c++ Queue类上调用dequeue时返回的内容