math.h
会遇到提供min
和max
的麻烦,但不会提供钳制功能。我原以为,因为它们通常都是类似的实现方式,所以它们都会出现在同一个库中。
math.h
是否有任何特殊原因没有钳位功能|宏?
是math.h
的创造者认为没有必要还是他们只是不考虑它?
编辑: 似乎人们忽略了这一点。我不是在问为什么他们不加钳,因为我很懒,不喜欢写一个新夹子 - 恰恰相反,我几乎没用过它(虽然我承认我使用它比我使用的一些标准更多库)。
我所问的是“有没有人知道为什么c ++标准化机构或创作者或任何选择不在math.h
中包含钳位功能的人?”。
我绝不抱怨它不在math.h
,我只是在问“它有没有充分的理由不存在?”。
编辑:
我明确地 不询问如何编写clamp()
函数。
答案 0 :(得分:11)
其他答案不再有效,因为std::clamp现在在C ++ 17中。
在撰写本文时,海湾合作委员会并不支持will be in GCC 7。
答案 1 :(得分:7)
也许是因为:
double clamp(double x, double upper, double lower)
{
return min(upper, max(x, lower));
}
使用的字符少于您的问题。
另一种无类型方法是
#define CLAMP(x, upper, lower) (MIN(upper, MAX(x, lower)))
假设您有正常形式的MIN
和MAX
个宏。
模板化C ++版本可以按如下方式实现:
template<class T>
const T& clamp(const T& x, const T& upper, const T& lower) {
return min(upper, max(x, lower));
}
当然,后者不适用于良好的“C”。
为了更具建设性,该功能不在标准库中,因为作者并不觉得需要它足以添加它。很明显如何实现你想要的功能(见上文),所以没有特别的困难。一旦你对库中的内容有了标准,添加更多功能就会冒与现有代码冲突的命名空间,需要文档,测试等等,因此任何新功能都需要跨越一般有用的门槛。
答案 2 :(得分:6)
虽然我不能真的回答这个问题,但无论如何我还要加两分钱。在this standards committee页面上搜索数学函数后,我找不到clamp()
函数的任何提及。
我确实在其他类似文件中找到了提出数学函数的文件this PDF;大多数看起来很专业。这让我相信标准库中缺少像clamp()
这样的函数,因为没有人提出它。
就个人而言,我宁愿看到添加到标准库中的简单(和经常使用的)数学函数,而不是99%的开发人员可能永远不会使用的函数。对于后者,有专门的图书馆,但这当然是我无关紧要的意见。
我非常希望看到标准中添加的一个例子:(优秀)GLM库的大部分核心功能。这也包括clamp()
: - )
或许是时候撰写提案并提交意见征得批准;这是解决问题的唯一方法。 This页面提供了有关提案的信息。
答案 3 :(得分:1)
一些开发人员认为它很有用。示例:
linux / kernel.h有clamp()
GTK + GLib有CLAMP()
。
我总是#define
。但如果它是标准化的话会更好。
答案 4 :(得分:0)
你不可能希望为你需要的一切提供内置功能。此外,如果您看一下here,Java中也没有钳位功能。钳位函数很容易编写,显然作者认为它不常用于标准库中。