2012-06-19 8 views
35

C++ ISO仕様、§ 26.2/2によれば:なぜC++はその複合体をfloat、double、またはlong doubleに対してのみインスタンス化することを義務付けていますか?

float以外の任意のタイプのためのテンプレートをインスタンス化complexdoubleまたはlong doubleの効果が指定されていません。

なぜ標準の作成者がこの制限を明示的に追加するのですか?たとえば、complex<int>またはcomplex<MyCustomFixedPointType>を人工的な制限のように見なすと、何が起こるかは不明です。

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

は、私は主にOPがabscomplex<int>のための奇妙な出力を与えていた理由として混乱したためthis earlier questionのこの質問を、求めています。これは、固定小数点型、より高精度の実数などから数字をcomplexにすることを考えれば、まだまだ意味がないと言えます。

+4

以前の回答を見てから笑ってしまいましたが、本当に良い質問です。 – chris

+9

@ chris-私は、それに対して高いレベルの理由を与えることができなければ、その答えを与えるのが悪いと感じました。私は通常、「これはX、Y、Zの理由でC++の奇妙なケースです」と言っているのが良いですが、今回は何が起きているのか分かりません。 – templatetypedef

+4

"標準化複合体は、委員会で議論され、10年以上にわたって議論されており、少なくとも1つのベンダーからそれを支持するという大きな抵抗が存在する」 http://lists.cs.uiuc.edu/pipermail/cfe-dev/2012-March/020398。html –

答えて

28

std::complexの多くを整数に正しく実装することはできません。例えば、complex<long>ため

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

は、sqrt(pow(z.real(), 2) + pow(z.imag(), 2))の値を返すので、複素数は、(実際の、IMAG)ペアとして表される場合T = long戻り値を持つことができません。ほんの少しの操作しか意味をなさないでしょう。

さらに悪いことに、名前付きコンストラクタは、デフォルトのコンストラクタを破らずに信頼できるものにすることはできません。標準では、「複雑な整数」がGaussian integersであること、およびそれらのコンストラクタの1つがひどく壊れていることを指定する必要があります。

最後に、あなたの "複雑な整数部"をどのように提供したいと思いますか?それと "複雑な余り"を望みますか? :)

Tstd::complexに設定すると、グラフトサポートよりほんの少しの操作で別のgaussian_int<T>タイプを指定する方が合理的だと思います。

+1

私たちが説明するのとまったく同じ機能を選んだのは面白いです。 :) –

+0

決定のための固体の数学的な理由を導入してくれてありがとう。私はこれが決定のためのエレガントな理論的理由を提供すると思う。私はこれまでGaussian整数については聞いていなかったので、それらを持ってきてくれてありがとう! – templatetypedef

+0

@templatetypedef:ありがとう、+1の質問です。私は '複合体'が一体型にテンプレート化されたときに何が起きるかは決して考えなかったでしょう。 [私は数学者ではありませんが、誰かがこれについて私が間違っていることを証明できれば、してください。] –

12

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

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

T == int場合、absは精度の大幅な損失を意味しますintを返します:たとえば。

関連する問題