Почему С++ задает этот комплекс только для создания float, double или long double?
В соответствии со спецификацией ISO С++, раздел 26.2/2:
Эффект создания шаблона complex
для любого типа, отличного от float
, double
или long double
, не указан.
Почему стандартные авторы явно добавляют это ограничение? Это делает его неуказанным, например, что происходит, если вы делаете complex<int>
или complex<MyCustomFixedPointType>
и представляете собой искусственное ограничение.
Есть ли причина для этого ограничения? Есть ли обходной путь, если вы хотите создать экземпляр complex
со своим собственным типом?
Я прежде всего задаю этот вопрос из-за этого более раннего вопроса, в котором OP был смущен тем, почему abs
давал причудливые выходы для complex<int>
, Тем не менее, это все еще не имеет смысла, учитывая, что мы также можем сделать цифры complex
из типов фиксированных точек, более высоких точных чисел и т.д.
Ответы
Ответ 1
Вы не можете правильно реализовать многие операции std::complex
для целых чисел. Например.
template <class T>
T abs(const complex<T> &z);
для a complex<long>
не может иметь возвращаемое значение T = long
, когда комплексные числа представляются как пары (real, imag), так как он возвращает значение sqrt(pow(z.real(), 2) + pow(z.imag(), 2))
. Только несколько операций будут иметь смысл.
Хуже того, конструктор с именем polar
нельзя сделать надежным, не нарушая конструктор по умолчанию и наоборот. Стандарт должен был бы указать, что "комплексные целые числа" гауссовские целые числа для них могут быть использованы и что один из конструкторов сильно нарушен.
Наконец, как бы вам понравилось ваше "комплексное целочисленное деление", и вам понравится "сложный остаток"?:)
Подводя итог, я думаю, было бы разумнее указать отдельный тип gaussian_int<T>
всего несколькими операциями, чем поддержка трансплантата для интегрального T
на std::complex
.
Ответ 2
Вероятно, для совместимости со вспомогательными функциями. Например:
template<class T> T abs (const complex<T>& x);
Если T == int
, abs
вернет int
, что будет означать массовую потерю точности.