使用 std::optional,而不是自己的结构



我需要使用可为空的类型。

我找到了完全符合我期望std::optional

但此功能从 C++ 17 开始提供,实验分支从 C++ 14 开始提供。这意味着编译器(不同的计算机(必须更新。

它只是为数据和布尔分配空间,指示变量是否存在。

为什么我应该使用此功能而不是自己的结构?

使用std::optional有什么好处吗?

谢谢!

在意识到你对这个问题的观点后,我想用一句话来回答。

P.13:根据需要使用支持库。

使用原因精心设计、文档完善且支持良好的库可节省时间 和努力;它的质量和文档可能会更高 而不是如果你的大部分时间必须花在上面,你能做什么 一个实现。图书馆的成本(时间、精力、金钱等( 可以在多个用户之间共享。广泛使用的库更有可能 保持最新状态并移植到新系统,而不是个人 应用。了解广泛使用的库可以节省时间 其他/未来项目。因此,如果存在适合您的库 应用程序域,使用它。

从C++核心准则

归根结底,你陷入了两难境地。您有一个标准化的、受支持的功能,该功能在您的工具集中不可用。该工具集可以升级,但由于不同的原因,这很麻烦。

同时,你有一个自制软件解决方案,它不是标准的,可能缺乏功能(因为你正在根据你的特定用例定制你的自制软件,可能不会花精力来支持你不需要的用例(,可能在极端情况下有错误,但立即可用。怎么办,升级还是不升级?

没有答案(否则,就不会有困境(,但在这种情况下人们倾向于做的是

  • 确保他们的解决方案至少具有与标准解决方案相同的接口
  • 将解决方案放入指定的命名空间(即std_hack、future_std等(
  • 一旦他们自然地升级到具有标准解决方案的工具集,他们就会从指定的命名空间中删除他们的自制软件,在所有调用中用std替换指定的命名空间,并以非常低的成本进行直接的标准替换。

但是此功能从 C++ 17 开始可用,实验分支从 C++ 14 开始可用。这意味着编译器(不同的计算机(必须更新。

首先,理想情况下,更新编译器应该不是什么大问题。

如果这是一件大事,最好的办法就是改进您的流程,直到它不再是一件大事。

如果你真的做不到(并且你的项目将永远被冻结(,只需使用相同内容的 Boost 版本。无论如何,通过 tr1 或实验添加的几乎所有内容都是首先在 Boost 中进行迭代的。

使用您可以使用的两个现有(好的,有文档记录的,经过良好测试的(实现编写自己的版本,绝对应该是最后的手段。

使用 std::optional有什么好处吗?

据我所知,std::optional的目的和与替代方案的一个主要区别是在堆栈上具有值(来自 cpp首选项(:

如果可选包含值,则保证该值作为可选对象占用空间的一部分进行分配,即不会发生动态内存分配。因此,可选对象对对象而不是指针进行建模,即使定义了运算符*((和运算符>((。

根据您的情况,这可能是可取的,也可能不是。对于对象是否存在,智能指针可能就足够了,但随后您必须使用动态内存分配。

最新更新