C++ 我可以避免返回函数的模板返回类型吗?
我正在构建一个优先级que,并试图使其成为一个模板类。当我弹出时,它必须返回类型T。如果que中没有任何内容,是否有一种方法可以不返回任何内容,或者有一种良好的做法可以避免崩溃?这里的预期行为是抛出异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回null,则该值是不明确的。此处的预期行为是引发异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回,则该值是不明确的。模板与问题无关 处理这种情况有两种常见的方法:C++ 我可以避免返回函数的模板返回类型吗?,c++,C++,我正在构建一个优先级que,并试图使其成为一个模板类。当我弹出时,它必须返回类型T。如果que中没有任何内容,是否有一种方法可以不返回任何内容,或者有一种良好的做法可以避免崩溃?这里的预期行为是抛出异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回null,则该值是不明确的。此处的预期行为是引发异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值
pop
定义为有效。因此,用户需要在调用pop
之前执行空性检查(需要提供isEmpty
功能)。如果不满足此前提条件,则异常/错误返回是一种有效的处理方法模板与问题无关 处理这种情况有两种常见的方法:
pop
定义为有效。因此,用户需要在调用pop
之前执行空性检查(需要提供isEmpty
功能)。如果不满足此前提条件,则异常/错误返回是一种有效的处理方法一般来说,
pop
操作应该返回一个值。这是因为返回类型的复制构造函数可能会引发异常;如果发生这种情况,该值将从队列中消失,并且没有被复制到任何地方,因此它将消失
相反,应该有两个操作:一个是返回对数据结构顶部对象的引用的top
函数,另一个是删除顶部元素但不返回任何内容的pop
函数。如果查看std::queue
,您将看到成员void pop()
和reference front()
,它们返回对顶部元素的引用
现在来回答你的问题<代码>弹出空队列是一个错误。在标准库中,它生成未定义的行为。如果要添加用于错误检查的代码,则应引发异常或中止程序。我倾向于后者;如果调用代码没有确定有一个元素要弹出,那么它很可能没有被编写来可靠地处理异常。另一方面,在GUI中,可能应该抛出一个异常来终止当前操作;这将使应用程序运行并等待下一个用户请求。一般来说,
pop
操作应该返回一个值。这是因为返回类型的复制构造函数可能会引发异常;如果发生这种情况,该值将从队列中消失,并且没有被复制到任何地方,因此它将消失
相反,应该有两个操作:一个是返回对数据结构顶部对象的引用的top
函数,另一个是删除顶部元素但不返回任何内容的pop
函数。如果查看std::queue
,您将看到成员void pop()
和reference front()
,它们返回对顶部元素的引用
现在来回答你的问题<代码>弹出空队列是一个错误。在标准库中,它生成未定义的行为。如果要添加用于错误检查的代码,则应引发异常或中止程序。我倾向于后者;如果调用代码没有确定有一个元素要弹出,那么它很可能没有被编写来可靠地处理异常。另一方面,在GUI中,可能应该抛出一个异常来终止当前操作;这将使应用程序运行并等待下一个用户请求。抛出异常将是合理的。也许可以查看
std::priority\u queue
以获得灵感?抛出异常将是合理的。也许可以查看std::priority\u queue
以获得灵感?提到它我感觉有点糟糕,但是optional
将有效地使其为空。不过,异常确实比试图处理返回无效值要好。返回null或其他微不足道的值可能不是一个好主意。如果实例化priority_queue,则构造一个实例并返回它,这可能会导致意外的结果。作为模板类编写器,您不能假设typeT
和“null”之间的关系。“空”充其量只是一个概念NULL
是一个空指针常量,不能假定t
是指针。毕竟,C++不是java。我觉得提到它有点不好,但是<代码>可选< /COD>会有效地使它无效。不过,异常确实比试图处理返回无效值要好。返回null或其他微不足道的值可能不是一个好主意。如果我实例化priority_queue,构造一个实例并返回它,这可能会导致意外的结果