C++标准库中会有算术类型的概念吗?

Will there be a concept for arithmetic types in C++ standard library?

我一直在 C++ reference and i couldn't find a concept for arithmetic types. I couldn't also find it in p0898 上浏览概念库。我认为这样的概念会很有帮助。 代替做:

template <typename T>
T some_function(T arg) requires std::integral<T> || std::floating_point<T>
{ /* functions body */ }

我可以这样做:

template <std::arithmetic T>
T some_function(T arg)
{ /* functions body */ }

我显然可以自己定义它,这并不难(例如 template <typename T> concept arithmetic = std::integral<T> || std::floating_point<T>;),但在我看来,这样的基本概念应该在标准库中定义。它不存在有什么充分的理由吗?或者有什么建议可以添加吗?

Is there any good reason why it's not there? Or is there any proposal to add it?

没有任何建议添加它,但我希望看到一条 NB 评论只是建议 template <typename T> concept arithmetic = std::is_arithmetic_v<T>;(这不能保证C++20会有这个概念,只是说至少会考虑)。

标准库概念是由 Ranges 提案添加的,并由某些概念的算法需求驱动。 integral 经常出现,但我想 arithmetic 从来没有出现过,所以它从来没有被添加过。例如,如果您在 2019 年 7 月查看 N4382 (from early 2015), you can see that Integral (and SignedIntegral and UnsignedIntegral) were there from the very beginning... whereas even FloatingPoint got added way later. (by P0631... 甚至添加浮点概念的论文也没有提及 arithmetic)


当然,然后你会遇到一个有趣的问题,即它应该严格基于该类型特征还是应该 template <typename T> concept arithmetic = integral<T> || floating_point<T>; 以便两者integralfloating_point 概念包含 arithmetic。大概?也许吧?

免责声明:我不是 C++ 专家,对 C++ 概念也不是很熟悉。所以下面的回答可能有点出轨,但我在不同的背景下思考这个概念,并认为这里的一些观点可能是相关的。

除了应该涵盖整型和浮点类型的示例之外,您没有确切说明概念应该传达什么。但从更理论、更概念的角度来看,"arithmetics" 可以应用得更广泛——尽管 arithmetics 这个词暗示它是关于 numbers

直觉上,人们可以期望这个概念传达以下内容:

问题类型支持基本算术运算,+-*/,这些运算的结果类型与操作数的类型。通过快速网络搜索,这个想法似乎大致如下形式化:

self operator+(self const& x, self const& y);
self operator−(self const& x, self const& y);
self operator∗(self const& x, self const& y);
self operator/(self const& x, self const& y);

但是,正确的算术还需要更多:

  • 给定操作下的元素必须有一个闭包
  • 必须有加法的中性元素(0)
  • 必须有乘法中性元素(1)
  • 每个元素都必须有一个加法逆元 (-x)
  • 每个元素都必须有一个乘法逆元(/x - 除了加法的中性元素...)

你看这里打开了一罐蠕虫。这些约束已经很难或不可能对整数类型执行,因为可能没有加法逆,特别是对于 unsigned 类型。对于浮点类型,由于 +/-inf 并且最重要的是:NaN,特殊情况很快就会失控。所有这些还没有考虑浮点运算的有限精度。


在理论的兔子洞中更进一步:算术的概念可能应该是一般代数概念的一种特殊形式(或组合)。例如,将无符号整数类型视为循环 group, and to some extent, some structures involving integral or floating point types have properties that would be associated with a ring.

是完全正确的

因此,一个超越 "either float or int" 的算术概念肯定会很有趣,但有很多注意事项。试图清晰地表述这个概念,以便它也可以应用于 复数 或类似的结构,这是很困难的。并且如果有人试图定义它,那么人们当然也想涵盖其他代数结构,如群或环(例如对于矩阵或多项式)甚至vector spaces...

有些人 尝试过 至少:快速网络搜索显示 Techcnical Report: Fundamental Algebraic Concepts in Concept-Enabled C++ 解决了其中一些想法,包括算术,并指出了其中的困难与之相关。不过,它是从 2006 年开始的 - 可能会有更新的研究,基于这些概念进入标准的方式。