tem*_*def 39 c++ math language-design complex-numbers
根据C++ ISO规范,§26.2/ 2:
将模板实例化为
complex
除float
(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>
只比整体移植支持一些操作型T
上std::complex
.
Luc*_*ore 12
可能与辅助函数兼容.例如:
template<class T> T abs (const complex<T>& x);
Run Code Online (Sandbox Code Playgroud)
如果T == int
,abs
将返回int
,这将意味着精确度的巨大损失.