我想知道是否可以使用实现单个(甚至可能是双重)链接列表std::experimental::optional
。
template <typename T>
struct node {
std::experimental::optional<node<T>> next;
T data;
};
这种设计的优点/缺点是什么?可以使用新c++1z
功能来实现前哨功能,还是将它们全部消除?这也会扩展到n元树吗?
不能以这种方式实现链接列表,因为您的node
-type始终是不完整的。这是一个更完整的示例,说明了此问题:
#include <iostream>
#include <experimental/optional>
template <typename T>
struct node {
std::experimental::optional<node<T>> next;
T data;
};
int main( int, char ** )
{
std::cout << sizeof( node<int> ) << std::endl;
return 0;
}
问题的关键是,optional<T>
需要T
是完整的,但在其中定义点next
,node
是不完整的。optional<T>
需要完整类型的原因是它T
直接存储在optional
对象内,即,它不在堆上分配内存。结果,它必须知道的大小T
。在内部,它包含的缓冲区sizeof( T )
。就内存布局而言,您可以将其optional<T>
视为
template <class T>
struct optional
{
bool _containsValue;
char _buffer[ sizeof( T ) ];
};
但实际上,由于内存对齐要求,它更加复杂。
在您的情况下,为了知道的大小optional<node>
,它必须知道的大小,node
为此,它必须知道的大小optional<node>
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句