41

C ++ ISO仕様によると、§26.2/ 2:

、またはcomplex以外のタイプのテンプレートをインスタンス化する効果は指定されていません。floatdoublelong double

標準の作成者がこの制限を明示的に追加するのはなぜですか?complex<int>これにより、不特定になります。たとえば、またはを作成complex<MyCustomFixedPointType>して人為的な制限のように見える場合はどうなりますか。

この制限の理由はありますか?complex独自のカスタムタイプでインスタンス化する場合の回避策はありますか?

私が主にこの質問をしているのは、この以前の質問absのためです。この質問では、OPがに奇妙な出力を提供する理由について混乱していましたcomplex<int>complexとはいえ、固定小数点型やより高精度の実数などから数値を作成したい場合もあることを考えると、これはまだまったく意味がありません。

4

2 に答える 2

32

std::complex整数に対する操作の多くを適切に実装することはできません。例えば、

template <class T>
T abs(const complex<T> &z);

forは、複素数が(real、imag)ペアとして表される場合、の値を返すため、戻り値をcomplex<long>持つことはできません。いくつかの操作だけが意味をなします。T = longsqrt(pow(z.real(), 2) + pow(z.imag(), 2))

さらに悪いことに、polar名前付きコンストラクターは、デフォルトのコンストラクターを壊さずに信頼できるものにすることはできません。逆もまた同様です。標準では、「複素整数」がガウス整数であり、それらを使用できるようにすること、およびコンストラクターの1つが大幅に壊れていることを指定する必要があります。

最後に、「複雑な整数除算」をどのように提供し、それとともに「複雑な剰余」を提供しますか?:)

要約すると、積分のグラフトgaussian_int<T>サポートよりも、わずかな操作で別のタイプを指定する方が賢明だと思います。Tstd::complex

于 2012-06-19T20:27:32.693 に答える
12

おそらくヘルパー関数との互換性のためです。例えば:

template<class T> T abs (const complex<T>& x);

の場合T == intabsが返さintれます。これは、精度が大幅に低下することを意味します。

于 2012-06-19T20:27:10.150 に答える