为什么math.h中没有钳位功能

问题描述 投票:6回答:5

math.h遇到了提供minmax的麻烦,但没有钳制功能。我本以为,因为它们通常都是类似的实现方式,所以它们都会出现在同一个库中。

有没有什么特别的原因,math.h没有钳位功能|宏?是不是math.h的创造者认为没有必要,或者他们只是没想到它?

编辑:似乎人们忽略了这一点。我不是在问为什么他们不加钳,因为我很懒,不喜欢写一个新夹子 - 恰恰相反,我几乎没用过它(虽然我承认我使用它比我使用的一些标准更多库)。

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

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

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

c++ std
5个回答
11
投票

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

在撰写本文时,GCC不支持,但will be in GCC 7


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)))

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

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

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

当然,后者不适用于良好的C.

为了更具建设性,该功能不在标准库中,因为作者并不觉得需要它足以添加它。很明显如何实现你想要的功能(见上文),所以没有特别的困难。一旦您对库中的内容有了标准,添加更多功能就会冒与现有代码冲突的命名空间,需要文档,测试等,因此任何新功能都需要跨越一般有用性的阈值。


6
投票

虽然我无法回答这个问题,但无论如何我还要加两分钱。在this standards committee页面上搜索数学函数后,我找不到任何关于clamp()函数的提及。

我确实发现,在其他类似的文件中,this PDF记录了提出的数学函数;大多数看起来很专业。这使我相信标准库中缺少像clamp()这样的函数,因为没有人提出它。

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

我希望看到的标准中增加了一个例子:(优秀)GLM库的大部分核心功能。这包括clamp()以及:-)

也许现在是时候撰写提案并提交意见或批准;这是解决问题的唯一方法。 This页面提供有关提案的信息。


1
投票

一些开发人员认为它很有用。例子:

  • linux / kernel.h有clamp()
  • GTK + GLib有CLAMP()

我总是#define它。但如果它是标准化的话会更好。


0
投票

您不可能希望为您需要的一切提供内置功能。另外,如果你看看here,Java中也没有钳位功能。钳位函数很容易编写,显然作者认为它不常用于标准库中。

© www.soinside.com 2019 - 2024. All rights reserved.