执行std :: optional类

时间:2014-09-15 09:16:33

标签: c++

我需要为可选值实现快速解决方案。我不想拖入任何第三方库。

一般情况下如何实施可选类?可选对象是否仍然默认 - 当它处于'null-state'时构造底层对象?

3 个答案:

答案 0 :(得分:6)

  

一般情况下如何实施可选类?

通常,一个布尔标志用于指示它是否为空,以及一个适当大小和对齐的字节数组来存储该值。

  

可选对象是否仍然默认 - 构建基础对象,当它处于' null-state'?

没有;这将对存储的类型施加不必要的要求,以及引起潜在的不良副作用。当optional变为非空时,将使用placement-new创建存储的对象,并在析构函数变为空时使用析构函数调用将其销毁。

对于快速而肮脏的实现,如果您不需要Boost或建议的标准版本的所有灵活性,您可以简单地存储默认构造的对象。

  

我不想拖入任何第三方图书馆。

我会重新考虑你为什么不觉得自己想要那个。 Boost实现仅限于标头,经过良好测试,如果到达时应该可以直接替换为标准版本。我当然更信任它,而不是我自己拼凑的东西。

答案 1 :(得分:3)

首先,我强烈建议你看一下Boost(特别是在Boost.Optional) - 使用Boost几乎是标准做法,它可以帮你重新发明轮子。

如果由于某种原因你不愿意使用Boost.Optional,那么有很多类似的仅限标头的库,例如https://github.com/akrzemi1/Optional

答案 2 :(得分:1)

或更早的版本中,您可以使用经过空检查的T*或仅使用std::pair<T, bool>。后者的问题是,如果您的T的默认构造很昂贵,那可能会很浪费。

或更高版本中,您仍然可以使用T*,但也可以使用std::optional<T>。在此,后者仅在有效的情况下构造一个T

值得注意的是,std::optional仅在以下几种情况下是一个不错的选择:https://topanswers.xyz/cplusplus?q=923#a1085