在 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的主要内容,如果未能解决你的问题,请参考以下文章