tl;dr:我想构造一个包含泛型类型Value成员的ListEntry类,但Value不是默认可构造的,并且ListEntry不知道如何构造它。我永远不会访问这个Value成员,所以它没有被初始化并不重要。
为什么我要这样做
我正在实现一个大致类似于以下内容的双链表
template<class Value>
class ListEntry {
Value value;
ListEntry<Value> *prev;
ListEntry<Value> *next;
};
template<class Value>
class List {
ListEntry<Value> sentinel;
};
列表条目之间的链接总是形成一个封闭的圆圈,其中哨兵将最后一个列表元素连接到第一个列表元素。sentinel 对象由 sentinel.prev = &sentinel 和 sentinel.next = &sentinel 初始化。
这样,我就摆脱了很多特殊情况,而且我永远不必检查 nullptr,因为没有空指针。将一个元素添加到列表的末尾(在最后一个元素和哨兵之间)并不是一种特殊情况,但与在两个真实元素之间的列表中间添加一个元素相同。
所以在所有真实的列表条目中,值字段将包含列表条目的实际值。对于他们,我可以通过在其构造函数中给它一个Value对象来初始化ListEntry,所以我不需要Value是默认可构造的。在哨兵中,值字段永远不会被访问。但不幸的是,由于Value不是默认可构造的,编译器不允许我创建哨兵对象。
我可以将ListEntry中的值成员设为指针、boost::optional 或类似的东西。由于性能问题,我不喜欢这个。关于如何在ListEntry中存储Value而不需要性能/内存成本并且不需要Value可以默认构造的任何想法?在我看来,必须有一种方法可以在不调用其构造函数的情况下获取Value对象。