在 C++11 上下文中使用 std::optional

Posted

技术标签:

【中文标题】在 C++11 上下文中使用 std::optional【英文标题】:Using std::optional in a C++11 context 【发布时间】:2019-12-27 02:57:17 【问题描述】:

我正在编写一个小型 C++11 库,我相信 std::optional 将是一些可以返回 nullptr 的函数的一个很好的补充。但是,std::optional 是 C++17 功能。由于要求是 C++11,因此我正在寻找在保持兼容性的同时使用 std::optional 的方法。

我发现feature macros可以测试。我想我可以用它来检测std::optional 是否可用...但是如果不可用,最好的方法是什么?

我应该提供自己的std::optional 实现吗?

std::optional 不可用时返回nullptr? (可能会弄乱我的代码。)

还是放弃这个想法,只返回nullptr

【问题讨论】:

boost::optional 呢? 如果要求 C++11,则不能使用std::optional。选择一个。 您始终可以自己制作。 AFAIK 它不依赖于任何 C++17 特性,只是在那之前它才被添加。 为什么,std::optional 并没有那么复杂。找到一些可靠的实现和/或编写一些模板代码。你不会从 C++11 的任何其他地方获得该类。 恕我直言,问题是您是要返回堆上的东西(对象)还是要重新运行一个值(不是在堆上创建的——这里是可选的帮助)。如果您只需要支持堆对象,则可以使用使用std::unique_ptr 的包装器来模仿可选 API。 (注意:我的公司使用了一个 std::optional 向后移植到 C++11,所以它可以与 C++11 一起使用。 【参考方案1】:

在 C++11 中没有使用 std::optional 的标准方法。您可以依赖 C++17,也可以不使用 std::optional

我应该提供自己的 std::optional 实现吗?

您可以编写自己的可选实现,但不能将其称为std::optional。或者,您可以使用预先存在的实现,例如 Boost 中的实现。

说了这么多,如果你还是要返回一个指针,那么使用可选的可能没有多大意义,因为指针已经有一个“空”值的表示:空指针。但是,如果您需要区分 null 和 empty,那么 optional 可能很有用。

【讨论】:

【参考方案2】:

使用此标头:https://github.com/TartanLlama/optional

它相当于 std::optional。但它也适用于 C++11。 升级到 C++17 后,将代码切换到 #include <optional>

【讨论】:

【参考方案3】:

您不应使返回类型依赖于 C++ 标准版本。 标准版本开关旨在能够编译具有不同值的程序的不同部分。 如果您基于此采取不同的行为,您将破坏 ODR。

【讨论】:

以上是关于在 C++11 上下文中使用 std::optional的主要内容,如果未能解决你的问题,请参考以下文章

__global__ 在 c 中函数声明的上下文中是啥意思?

如何在类上下文中使用std :: mutex

C# Query 可以在上下文中独立更改

C++11并发编程入门

可变参数与foreach 的原理

为啥指针可以为NULL