C ++标准库中是否存在算术类型的概念?

Ada*_*ior 6 c++ c++-standard-library c++-concepts c++20

我一直在浏览C ++参考上的概念库,但找不到算术类型的概念。在p0898中也找不到它。我认为这样的概念将非常有帮助。插手:

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

我可以做:

template <std::arithmetic T>
T some_function(T arg)
{ /* functions body */ }
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*o13 7

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

\n\n

除了它应该涵盖整数和浮点类型的示例之外,您没有确切地说这个概念应该传达什么。但从更理论、概念的角度来看,“算术”的应用范围可以更广泛——尽管算术这个词意味着它是关于数字的。

\n\n

直观上,人们可以期望这个概念传达以下信息:

\n\n

该类型支持基本算术运算 、+-*/并且这些运算的结果类型与操作数的类型相同。通过快速的网络搜索,这个想法似乎大致如下:

\n\n
self operator+(self const& x, self const& y);\nself operator\xe2\x88\x92(self const& x, self const& y);\nself operator\xe2\x88\x97(self const& x, self const& y);\nself operator/(self const& x, self const& y);\n
Run Code Online (Sandbox Code Playgroud)\n\n

然而,正确的算术还需要更多:

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

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

\n\n
\n\n

进一步深入理论兔子洞:算术的概念可能应该是一般代数概念的一种特殊形式(或组合)。例如,将无符号整数类型视为循环是完全可以的,并且在某种程度上,涉及整型或浮点类型的某些结构具有与环相关的属性

\n\n
\n\n

因此,超越“浮点数或整数”的算术概念肯定会很有趣,但有很多注意事项。试图清晰地表述这个概念,以便它也可以应用于复数或类似的结构,是很困难的。如果有人试图定义这一点,那么人们肯定还想涵盖其他代数结构,例如群或环(例如矩阵或多项式)甚至向量空间......

\n\n

至少有人尝试过这一点:快速的网络搜索显示了一份技术报告:概念支持的 C++ 中的基本代数概念,该报告解决了其中一些想法,包括算术,并指出了与之相关的困难。不过,这是从 2006 年开始的 - 可能会有更新的研究,基于这些概念进入标准。

\n


Bar*_*rry 5

有什么充分的理由为什么它不存在?还是有任何添加建议?

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

Ranges提案添加了标准库概念,并由某些概念的算法需求来驱动。integral出现了很多,但是我想arithmetic从来没有做过,所以就从来没有添加。例如,如果您看一下N4382(从2015年初开始),您会发现Integral(and SignedIntegralUnsignedIntegral)从一开始就在那儿……而FloatingPoint后来又被添加了。(通过P0631,于2019年7月...甚至添加了浮点概念的论文也没有提及arithmetic


当然,那么你进入它是否应基于严格的该类型特质的乐趣问题还是应template <typename T> concept arithmetic = integral<T> || floating_point<T>;这样既integralfloating_point概念归入arithmetic。大概?也许?