为什么C ++要求这个复杂只能被实例化为float,double或long double?
根据C ++ ISO规范§26.2/ 2:
实例化除
float
,double
或long double
之外的任何types的模板complex
的效果是未指定的。
标准作者为什么要明确添加这个限制? 这使得它没有被指定,例如,如果你使complex<int>
或者一个complex<MyCustomFixedPointType>
看起来像是一个人为的限制,会发生什么。
有这个限制的原因吗? 如果你想用你自己的自定义types来实例化complex
,是否有解决方法?
由于这个早先的问题 ,我主要提出这个问题,在这个问题中,OP被混淆为什么abs
为complex<int>
提供了奇怪的输出。 也就是说,由于我们也可能希望从定点types,更高精度的实数等中做出complex
,所以这仍然不太合理。
你不能在整数上正确地实现许多std::complex
操作。 例如,
template <class T> T abs(const complex<T> &z);
对于complex<long>
当复数表示为(real,imag)对时,不能有T = long
返回值,因为它返回sqrt(pow(z.real(), 2) + pow(z.imag(), 2))
。 只有less数的行动是有道理的。
更糟糕的是,如果不打破默认构造函数, polar
名称构造函数就不可靠,反之亦然。 标准将不得不指定“复杂整数”是高斯整数,因为它们有任何用处,并且其中一个构造函数被严重破坏。
最后,你想怎么样服务你的“复数整数”,你想用这个“复数余数”吗? 🙂
总结一下,我认为指定一个单独的gaussian_int<T>
types只需要一些操作比移植到std::complex
上的整型T
支持更合理。
可能与辅助函数兼容。 例如:
template<class T> T abs (const complex<T>& x);
如果T == int
, abs
会返回int
,这将意味着精度的大量损失。