我需要为可选值实现快速解决方案。我不想拖入任何第三方库。
一般情况下如何实施可选类?可选对象是否仍然默认 - 当它处于'null-state'时构造底层对象?
答案 0 :(得分:6)
一般情况下如何实施可选类?
通常,一个布尔标志用于指示它是否为空,以及一个适当大小和对齐的字节数组来存储该值。
可选对象是否仍然默认 - 构建基础对象,当它处于' null-state'?
没有;这将对存储的类型施加不必要的要求,以及引起潜在的不良副作用。当optional
变为非空时,将使用placement-new创建存储的对象,并在析构函数变为空时使用析构函数调用将其销毁。
对于快速而肮脏的实现,如果您不需要Boost或建议的标准版本的所有灵活性,您可以简单地存储默认构造的对象。
我不想拖入任何第三方图书馆。
我会重新考虑你为什么不觉得自己想要那个。 Boost实现仅限于标头,经过良好测试,如果到达时应该可以直接替换为标准版本。我当然更信任它,而不是我自己拼凑的东西。
答案 1 :(得分:3)
首先,我强烈建议你看一下Boost(特别是在Boost.Optional) - 使用Boost几乎是标准做法,它可以帮你重新发明轮子。
如果由于某种原因你不愿意使用Boost.Optional,那么有很多类似的仅限标头的库,例如https://github.com/akrzemi1/Optional
答案 2 :(得分:1)
在c++14或更早的版本中,您可以使用经过空检查的T*
或仅使用std::pair<T, bool>
。后者的问题是,如果您的T
的默认构造很昂贵,那可能会很浪费。
在c++17或更高版本中,您仍然可以使用T*
,但也可以使用std::optional<T>
。在此,后者仅在有效的情况下构造一个T
。
值得注意的是,std::optional
仅在以下几种情况下是一个不错的选择:https://topanswers.xyz/cplusplus?q=923#a1085