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>;
以便两者integral
和 floating_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 年开始的 - 可能会有更新的研究,基于这些概念进入标准的方式。
我一直在 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>;
以便两者integral
和 floating_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 年开始的 - 可能会有更新的研究,基于这些概念进入标准的方式。