Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以避免返回函数的模板返回类型吗?_C++ - Fatal编程技术网

C++ 我可以避免返回函数的模板返回类型吗?

C++ 我可以避免返回函数的模板返回类型吗?,c++,C++,我正在构建一个优先级que,并试图使其成为一个模板类。当我弹出时,它必须返回类型T。如果que中没有任何内容,是否有一种方法可以不返回任何内容,或者有一种良好的做法可以避免崩溃?这里的预期行为是抛出异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回null,则该值是不明确的。此处的预期行为是引发异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值

我正在构建一个优先级que,并试图使其成为一个模板类。当我弹出时,它必须返回类型T。如果que中没有任何内容,是否有一种方法可以不返回任何内容,或者有一种良好的做法可以避免崩溃?

这里的预期行为是抛出异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回null,则该值是不明确的。

此处的预期行为是引发异常。用户应在尝试弹出前检查队列是否为空。您也可以返回null,但前提是您的类型T从未有null值,否则,如果由于发生错误或队列中的下一个值为null而返回,则该值是不明确的。

模板与问题无关

处理这种情况有两种常见的方法:

  • 将对象存储在堆上。删除后,将对象从数据结构中分离,并返回指向它的引用(指针),而不是对象本身。如果数据结构为空,则返回NULL
  • 仅当队列不为空时,才将您的
    pop
    定义为有效。因此,用户需要在调用
    pop
    之前执行空性检查(需要提供
    isEmpty
    功能)。如果不满足此前提条件,则异常/错误返回是一种有效的处理方法

  • 模板与问题无关

    处理这种情况有两种常见的方法:

  • 将对象存储在堆上。删除后,将对象从数据结构中分离,并返回指向它的引用(指针),而不是对象本身。如果数据结构为空,则返回NULL
  • 仅当队列不为空时,才将您的
    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,则构造一个实例并返回它,这可能会导致意外的结果。作为模板类编写器,您不能假设type
    T
    和“null”之间的关系。“空”充其量只是一个概念
    NULL
    是一个空指针常量,不能假定
    t
    是指针。毕竟,C++不是java。我觉得提到它有点不好,但是<代码>可选< /COD>会有效地使它无效。不过,异常确实比试图处理返回无效值要好。返回null或其他微不足道的值可能不是一个好主意。如果我实例化priority_queue,构造一个实例并返回它,这可能会导致意外的结果