应忽略指示其返回值的 c++ 函数

标签 c++ return-type

关闭。这个问题是opinion-based .它目前不接受答案。












想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它.

5年前关闭。




Improve this question




我有一个返回值的函数,但是在某些条件下(函数已知,但调用者不知道)我希望调用者忽略该值。

例如,假设您要计算平均海洋温度。为此,您将地球分成一百万个包裹,并询问每个包裹的温度。但是,当包裹在陆地上时,返回值需要表明该值不应包含在平均值中。

我可以想出一些方法来完成这项工作,但我不确定哪个是一个好的解决方案:

  • 定义一个永远不会明智的假值(比如-inf)
    返回值。调用者在使用之前检查该值是否是假的
    它。
  • 将返回类型增加为一对,其中第一部分是
    值和第二个 bool 值,表示虚假
  • 返回一个有一个值或没有值的 vector
  • 当值被忽略时抛出异常,因此调用
    函数可以处理异常并且知道值应该是
    忽略。
  • 通过指针返回并使用 nullptr 表示该值
    应该忽略

  • 解决方案 1 似乎是最快和最容易实现的,但如果调用者在不检查值是否有效的情况下使用该函数,也最有可能产生难以发现的错误。

    解决方案 2 和 3 需要传递一个稍微重一点的值,但似乎是一种不错的方法。

    解决方案 4 需要抛出大量异常调用作为程序的预期部分。我没有任何使用此类异常的经验。

    解决方案 5 的通用性很好(并且 nullptr 感觉是表示虚无的最佳方式),但为了获得双输出而取消引用指针似乎效率非常低。

    我知道唯一的方法真的知道哪种解决方案最快是对它们全部进行测试,但我想知道是否有任何常见的最佳实践来处理这种情况。

    性能对我来说相对重要,因为这个函数每帧会被调用大约 10,000 次。

    可能有这样的问题的答案,但我不知道哪些搜索词将其描述为“c++ fake/ignore return value”显然不是好词。

    最佳答案

    这似乎是一个基于意见的问题。

    我认为最好的方法是返回 optional<T>目的;如果它为空,则意味着没有返回值,如果它不为空,则调用者必须显式地“取消引用”它以获取该值,尽管实际上不涉及堆分配或指针。 (如果调用者忘记检查并试图从空的 T 中获取 optional<T> 将引发异常。)您可以使用 boost::optional现在,或 std::optional一旦 C++17 出来。

    就性能而言,这或多或少是选项 2,但具有更好的界面。

    关于应忽略指示其返回值的 c++ 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38447540/

    相关文章:

    c++ - 在编译C++时,如何把一个.a文件变成.so?

    c++ - 从链表的末尾而不是从头开始读取值 C++

    c++ - map 删除困难

    c - 从函数返回字符串(c语言)

    c - 为什么 printf() 即使没有被整数变量捕获也能工作?

    java - 返回类型为 void 的方法应该使用 return 语句吗?

    c++ - `>>>` 如何在 C++0x 中进行词法分析?

    c++ - 恢复 "Source Files"和 "Header Files"文件夹

    java - 分配与多重返回的最佳实践或任何性能影响

    java - 具有不同类型返回的功能接口(interface)中的 Null