【发布时间】: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 一起使用。)
标签: c++ c++11 c++17 nullptr stdoptional