为什么C++要求只为float,double或long double实例化复杂?

tem*_*def 39 c++ math language-design complex-numbers

根据C++ ISO规范,§26.2/ 2:

将模板实例化为complexfloat(double或未long double指定)之外的任何类型的效果.

为什么标准作者会明确添加此限制?这使得它没有被指定,例如,如果你制造complex<int>或者complex<MyCustomFixedPointType>看起来像是人为限制会发生什么.

有这个限制的原因吗?如果要complex使用自己的自定义类型进行实例化,是否有解决方法?

我主要是问这个问题是因为早先的问题,其中OP对为什么abs给出奇怪的输出感到困惑complex<int>.也就是说,考虑到我们也可能想要用complex固定点类型,更高精度的实数等来制作数字,这仍然没有意义.

Fre*_*Foo 30

您无法std::complex在整数上正确实现许多操作.例如,

template <class T>
T abs(const complex<T> &z);
Run Code Online (Sandbox Code Playgroud)

当复数表示为(实数,成对)对时,a complex<long>不能有T = long返回值,因为它返回值sqrt(pow(z.real(), 2) + pow(z.imag(), 2)).只有少数操作才有意义.

更糟糕的是,如果polar不破坏默认构造函数,则命名构造函数不可靠,反之亦然.该标准必须指定"复数整数"是高斯整数,以使它们具有任何用途,并且其中一个构造函数被严重破坏.

最后,你希望你的"复杂整数除法"如何服务,你想要一个"复杂的余数"吗?:)

总之,我认为这将是更明智的指定一个单独的gaussian_int<T>只比整体移植支持一些操作型Tstd::complex.


Luc*_*ore 12

可能与辅助函数兼容.例如:

template<class T> T abs (const complex<T>& x);
Run Code Online (Sandbox Code Playgroud)

如果T == int,abs将返回int,这将意味着精确度的巨大损失.