C ++初始化列表约束检查

时间:2017-03-20 17:20:14

标签: c++ constructor initialization

我试图明确限制我正在创建的课程的最大尺寸,并提出了似乎有效但似乎难看的解决方案。这个例子有点人为,但我想知道情况是否会更自然地出现。

这是原样:

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

}

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

为了清楚起见,我已经编辑了原文,以便更好地突出我所要求的内容。也就是说,是否存在一种功能上等效的方法,可以将约束放在初始化列表上。

这样的问题应该是什么样的解决方案?

1 个答案:

答案 0 :(得分: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