gpt4 book ai didi

c++ - 如何只允许对像对象这样的整数有效值并对其进行迭代?

转载 作者:太空宇宙 更新时间:2023-11-04 11:31:29 25 4
gpt4 key购买 nike

在我刚开始的一个项目中,我创建了一个基本上是整数类型包装器的类。我选择这样做有几个原因。首先,我想向其中添加一些方法,这些方法会告诉我一些关于我的值(value)的具体信息。例如,我可以有一个名为 is_odd() 的方法(这只是一个示例。其次,我想检查值是否始终在有效范围内。

所以我的类可能看起来像这样:

class C {
public:
// Constructor and some other stuff here including
// post and pre increment operators

inline void CheckInvariant() const
{ assert(0 <= value_ && value_ <= 8);};
private:
std::uint8_t value_;
};

现在我想迭代这个类的所有可能值。像这样:

for (C c(0); c <= c::max_value; ++c)
{
// Do something
}

或者甚至像这样:

// Note here that C::min_value <= c is always true
// because the value wrap-around.
for (C c = C::max_value; C::min_value <= c; --c)
{
// Do something
}

问题是当 c 递增超过 c::max_value 时,c 变得无效,并且由于我从 operator++ 调用“CheckInvariant()”,它失败了。

我首先很难将所有有效值放在一个数组中并对其进行迭代,但是将使用它的代码确实对性能至关重要并且这需要与直接使用整数一样快,并具有额外的好处绑定(bind)在 Debug模式下检查(断言)。

现在我明白它“有味道”,我的设计有缺陷。是否有任何已知模式可以让我防范无效值并仍然允许有效地遍历所有值?

感谢您的帮助。

最佳答案

在我看来你实际上有两个不变量,而不是一个。

首先是如果你访问的值必须在指定的范围内。第二个是在增量之后它必须不超过指定范围的一个。我相信您最好的方法是针对这两个条件进行两次不变检查。

最后请注意,像 is_odd 这样的成员函数并不是实现此类功能的正确方法。它们应该作为自由函数算法来实现,以提供通用代码而不是与您的类紧密耦合。

关于c++ - 如何只允许对像对象这样的整数有效值并对其进行迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24622289/

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