Pourquoi C ++ impose-t-il que ce complexe ne soit instancié que pour le flottant, le double ou le long double?

Selon les spécifications ISO C ++, §26.2 / 2:

L’instanciation du complex gabarits pour tout type autre que float , double ou long double n’est pas spécifiée.

Pourquoi les auteurs standard ajoutent-ils explicitement cette ressortingction? Cela le rend non spécifié, par exemple, que se passe-t-il si vous créez un complex ou un complex et semble être une ressortingction artificielle.

Y a-t-il une raison pour cette limitation? Existe-t-il une solution de contournement si vous souhaitez instancier un complex avec votre propre type personnalisé?

Je pose principalement cette question à cause de cette question précédente , dans laquelle le PO était confus quant à savoir pourquoi abs donnait des résultats bizarres pour le complex . Cela dit, cela n’a toujours pas de sens, étant donné que nous pourrions également vouloir faire complex nombres complex partir de types à virgule fixe, de nombres réels plus précis, etc.

    Vous ne pouvez pas implémenter correctement plusieurs opérations std::complex sur des entiers. Par exemple,

     template  T abs(const complex &z); 

    pour un complex ne peut pas avoir la valeur de retour T = long lorsque des nombres complexes sont représentés par des paires (réelles, imag), car il renvoie la valeur de sqrt(pow(z.real(), 2) + pow(z.imag(), 2)) . Seules quelques opérations auraient du sens.

    Pire encore, le constructeur nommé polar ne peut être rendu fiable sans casser le constructeur par défaut et inversement. La norme devrait spécifier que les “entiers complexes” sont des entiers gaussiens pour qu’ils soient utiles, et que l’un des constructeurs est gravement rompu.

    Enfin, comment aimeriez-vous que votre “division entière complexe” soit servie, et souhaitez-vous un “rest complexe” avec cela? 🙂

    En résumé, je pense qu’il serait plus judicieux de spécifier un type gaussian_int distinct avec seulement quelques opérations que la prise en charge de la greffe pour la T intégrale sur std::complex .

    Probablement pour la compatibilité avec les fonctions d’aide. Par exemple:

     template T abs (const complex& x); 

    Si T == int , abs retournerait int , ce qui signifierait une perte massive de précision.