11

math.h麻烦提供minand max,但不提供钳位功能。我原以为它们通常都是相似的实现方式,它们都会出现在同一个库中。

有没有什么特别的原因math.h不具有钳位功能|宏?是创作者math.h认为没有必要,还是只是没有考虑?

编辑:似乎人们在这里忽略了这一点。我不是问他们为什么不添加夹子,因为我很懒,不喜欢写一个新的夹子——恰恰相反,我几乎从不使用它(尽管我承认我使用它的次数多于使用一些标准图书馆)。

我要问的是“有没有人知道为什么 c++ 标准化机构或创建者或任何选择不在其中包含钳位函数的人math.h?”。

我绝不是抱怨它不在math.h,我只是在问“它不存在有充分的理由吗?”。

编辑:我明确 问如何编写clamp()函数。

4

4 回答 4

14

其他答案不再有效,因为std::clamp现在在 C++17 中。

在撰写本文时,GCC 不支持它,但将在 GCC 7中。

于 2017-02-01T16:18:41.613 回答
12

也许是因为:

double clamp(double x, double upper, double lower)
{
    return min(upper, max(x, lower));
}

使用的字符少于您的问题。

另一种无类型方法是

#define CLAMP(x, upper, lower) (MIN(upper, MAX(x, lower)))

假设你有正常形式的MINMAX宏。

模板化的 C++ 版本可以实现如下:

template<class T>
const T& clamp(const T& x, const T& upper, const T& lower) {
    return min(upper, max(x, lower));
}

自然,后者在好的 ol' C 中不起作用。

为了更具建设性,该函数不在标准库中,因为作者认为没有必要将其添加到足够的位置。如何实现你想要的功能是很明显的(见上文),所以没有什么特别的困难。一旦你对库中的内容有了一个标准,添加更多函数就有可能与现有代码发生命名空间冲突,需要文档、测试等,因此任何新函数都需要跨越一般有用性的阈值。

于 2014-02-09T09:21:02.433 回答
6

虽然我不能真正回答这个问题,但无论如何我都会加两分钱。在这个标准委员会页面上搜索数学函数后,我找不到任何关于clamp()函数的提及。

在其他类似的文件中,我确实找到了这个 PDF,它记录了提议的数学函数;大多数看起来很专业。这让我相信clamp()标准库中没有类似的功能,仅仅是因为没有人提出过它。

就个人而言,我宁愿看到将简单(并且经常使用)的数学函数添加到标准库中,也不愿看到 99% 的开发人员很可能永远不会使用的函数。对于后者,有专门的库,但这当然只是我不相关的意见。

我绝对希望看到添加到标准中的一个示例:(优秀的)GLM 库的大多数核心功能。这也包括clamp():-)

也许是时候写一份提案并提交评论\批准了;这是解决它的唯一方法。页面提供有关提案的信息。

于 2014-02-11T18:15:55.467 回答
0

你不能希望有你需要的所有东西的内置功能。此外,如果您在这里查看,Java 中也没有钳位函数。钳制函数很容易编写,显然作者认为它的使用频率不够高,无法将其包含在标准库中。

于 2014-02-09T07:43:35.113 回答