是否允许为自定义数字类型专门化数学常量?
Is it permissible to specialize mathematical constants for custom numeric types?
假设我创建自己的浮点类型 MyFloatingPoint
(例如,相对于 built-in 类型提供更高的精度)。是否允许在 C++20 <numbers>
header 中为此类型专门化常量,或者这是未定义的行为?
是的,但前提是特化依赖于程序定义的类型(而不是仅内置/标准库类型)。
参见 C++ 标准的 post-C++20 草案中的 [math.constants]/2。
请注意,如果标准中没有这样的特定许可,通常不允许特化标准库变量模板。参见 [namespace.std]/3。
根据 C++20 draft 看起来不错:
26.9.2
(...)
2. Pursuant to 16.5.4.2.1, a program may partially or explicitly specialize a mathematical constant variable
template provided that the specialization depends on a program-defined type
不,这不是未定义的行为(使用该术语时要小心)。
我没有看到任何大问题(特别是在阅读其他评论之后)。
#include <numbers>
struct my_floatingpoint_t
{
double value;
};
namespace std
{
namespace numbers
{
template<>
constexpr my_floatingpoint_t pi_v<my_floatingpoint_t>{3.14};
}
}
int main()
{
auto pi = std::numbers::pi_v<double>;
auto my_pi = std::numbers::pi_v<my_floatingpoint_t>;
return 0;
}
假设我创建自己的浮点类型 MyFloatingPoint
(例如,相对于 built-in 类型提供更高的精度)。是否允许在 C++20 <numbers>
header 中为此类型专门化常量,或者这是未定义的行为?
是的,但前提是特化依赖于程序定义的类型(而不是仅内置/标准库类型)。
参见 C++ 标准的 post-C++20 草案中的 [math.constants]/2。
请注意,如果标准中没有这样的特定许可,通常不允许特化标准库变量模板。参见 [namespace.std]/3。
根据 C++20 draft 看起来不错:
26.9.2 (...) 2. Pursuant to 16.5.4.2.1, a program may partially or explicitly specialize a mathematical constant variable template provided that the specialization depends on a program-defined type
不,这不是未定义的行为(使用该术语时要小心)。 我没有看到任何大问题(特别是在阅读其他评论之后)。
#include <numbers>
struct my_floatingpoint_t
{
double value;
};
namespace std
{
namespace numbers
{
template<>
constexpr my_floatingpoint_t pi_v<my_floatingpoint_t>{3.14};
}
}
int main()
{
auto pi = std::numbers::pi_v<double>;
auto my_pi = std::numbers::pi_v<my_floatingpoint_t>;
return 0;
}