C++初始值设定项列表约束检查

C++ initializer list constraint checking

本文关键字:列表 表约束 检查 C++      更新时间:2023-10-16

我正在尝试明确限制我正在创建的类的最大大小,并提出了一个似乎有效但看起来很丑陋的解决方案。这个例子有点做作,但我想知道万一情况更自然地出现。

这是原样:

PriorityQueue(const unsigned int maxSizeIn) :
            maxSize((maxSizeIn >= SOME_CONSTANT) ? SOME_CONSTANT - 1 : maxSizeIn),
            queueArray(new PriorityPair<T>*[maxSizeIn]()),
            currentHeapSize(0)
{
}

拙来自在初始化器列表中具有三元表达式。虽然这确实有效,但它看起来不是特别好,迫使我按行分隔列表的每个组件。我试图将该逻辑移动到构造函数的主体中,但我在尝试时遇到了问题。

为了清楚起见,我编辑了原文,以更好地突出我所问的内容。也就是说,是否有一种功能等效的方法更干净地对初始值设定项列表进行约束。

对于

这样的问题,应该采取什么解决方案?

您可以使用

std::min

maxSize(std::min(maxSizeIn, std::numeric_limits<unsigned int>::max() - 1));

在这里,std::numeric_limits<unsigned int>::max() - 1可以是任何常量 - 在您的示例中,这将是SOME_CONSTANT .

尽管请注意,在您的情况下没有任何意义。 maxSizeIn永远不能大于其类型的最大值。如果有人指定的大小大于构造函数std::numeric_limits<unsigned int>::max()的大小,则该人很快就会注意到他们的参数已溢出。

不过,你可以通过一个unsigned long