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

Using std::optional in a C++11 context

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

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

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

Return nullptrstd::optional 不可用时? (可能会弄乱我的代码。)

或者放弃这个想法,只保留 returning nullptr

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

Should I provide my own std::optional implementation?

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

综上所述,如果您无论如何都要返回一个指针,那么使用 optional 可能没有多大意义,因为指针已经具有 "empty" 值的表示形式:空指针。但是,如果您需要区分 null 和 empty,那么 optional 可能会有用。

使用这个 header:https://github.com/TartanLlama/optional

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

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