【发布时间】:2012-10-11 08:56:23
【问题描述】:
我想在 C++ 中实现一个类 Scala 的 Option / Haskell 类的 Maybe 类。出于效率原因,我不想使用动态分配的内存,也不想使用多态性。另外,如果 Option 为 None,我不希望创建任何嵌入类型的对象。
谁能告诉我以下方法是否会导致问题?我必须在我的 Option 类中为嵌入对象静态分配内存,但我无法定义嵌入类型的成员字段,因为即使 Option 为 None,这也会在创建 Option 对象时初始化。
template <typename T>
class Option {
private:
uint8_t _storage [sizeof (T)];
T * _embedded;
public:
Option () : _embedded (nullptr) {
}
Option (const T & obj) : _embedded (new (_storage) T (obj)) {
}
Option (const Option<T> & other)
: _embedded (
other->_embedded ? new (_storage) T (other->_embedded) : nullptr
) {
}
// ...
~Option () {
if (_embedded) _embedded->~T ();
}
};
【问题讨论】:
-
你可以查看Boost.Optional是如何实现的。
-
感谢您的提示。我应该知道 Boost 有它。
-
实际上,这是一个非常巧妙的表示。您还需要处理 assignment,但除此之外,我真的很喜欢直接存储指针而不仅仅是布尔值的想法。之后肯定会让事情变得更容易。
-
你离在这里实现一个'Variant'类型类还有半步之遥。
标签: c++ new-operator