gpt4 book ai didi

c++ - 在 constexpr 构造函数中获取一个特殊的指针值(类似于 "second"nullptr)

转载 作者:行者123 更新时间:2023-11-27 23:42:15 25 4
gpt4 key购买 nike

我有一个小的 ListNode 结构:

struct ListNode {
Object *prev;
Object *next;

constexpr ListNode() : prev(nullptr), next(nullptr) { }
};

ListNode 可以处于两种主要状态:

  • 列表的一部分
  • 不是列表的一部分

ListNode 是列表的一部分时,它的 prevnext 成员可以有两种不同的值:

  • 都是nullptr(这意味着该节点是列表的唯一成员)
  • 其中之一,或两者都是非nullptr

ListNode 不是列表的一部分时,它的 prevnext 成员不包含有用的信息。创建 ListNode 时,它会进入此状态。 prevnext 成员被初始化为 nullptr

现在,如您所见,ListNode 具有相同的状态(prevnext 都是 nullptr), 当:

  • 它不在列表中
  • 它在一个列表中,并且是唯一的成员

现在,我想区分这两种状态,仅用于调试目的。这个想法是,当 ListNode 被删除时,在删除之前,我检查该节点是否不在列表中,因为删除仍在列表中的 ListNode是一个错误(这可以用于更多的调试检查:在将 ListNode 添加到列表之前,可以检查此 ListNode 是否已经在列表中,等等) .

因此,我需要一个特殊的 Object 指针,它不是 nullptr,以指定不在列表中的状态。所以构造函数/析构函数是这样的:

constexpr ListNode() : prev(<special>), next(<special>) { }
~ListNode() { assert(prev==<special>&&next==<special>); }

现在的问题是,我怎样才能为此目的获取一个特殊的 Object 指针值?

一个解决方案可能是使用reinterpret_cast:

special = reinterpret_cast<Object*>(some_small_integer_value);

但我在 constexpr 构造函数中,其中 reinterpret_cast 是被禁止的(无论如何它是一个丑陋而脆弱的解决方案)。

请注意,在我的实际代码中,ListNode 实际上是一个模板,而 Object 可以是任何东西,甚至是具有 deleted/private 默认构造函数的类型,或抽象类

注2:当然,这个问题可以通过一个简单的bool成员变量轻松解决。但是,它会增加 ListNode 的大小(并且仅在调试版本中使用此 bool 变量不是一种选择,因为我的库的调试和发布版本是二进制兼容的,我想保留它)。

最佳答案

做出具体dgsomerton的评论

inline Object debug;
inline constexpr auto special = &debug;

现在 special 是一个保证唯一且非空的指针,适合进行相等性测试。

关于c++ - 在 constexpr 构造函数中获取一个特殊的指针值(类似于 "second"nullptr),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53643809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com