Заставить C ++ автоматически конвертировать int в double - PullRequest
0 голосов
/ 10 сентября 2018

Когда у меня есть числовой тип, который определяет operator< для double, но не для int, сравнение с литералами int не работает. Это проблема, поскольку части стандартной библиотеки, т.е. std::complex содержат литералы int.

Можно ли заставить компилятор обрабатывать литералы int как двойные при использовании типа?

Упрощенный пример:

// the defined operator
template<typename T>
bool operator<(const Type<T> &lhs, const T &rhs);

complex<Type<T>> complex_number;
1.0 / complex_number; // this fails

Ошибка происходит внутри _Div метода std::complex при

template<class _Other> inline
void _Div(const complex<_Other>& _Right)
    // ...
    else if ((_Rightimag < 0 ? -_Rightimag : +_Rightimag)

что вызывает ошибку:

error C2678: binary '<': no operator found which takes a left-hand operand of type 'Type<T>' (or there is no acceptable conversion)
(...)
complex(665): note: while trying to match the argument list '(Type<T>, int)'
      [
          T=double
      ]

Я думаю, что, вероятно, код в std::complex должен быть _Rightimag < static_cast<_Other>(0) для работы со всеми числовыми типами, но я должен работать с тем, что предоставляет stdlib.

Поскольку другой тип также из библиотеки, я ищу способ добавить неявное преобразование в мой код.


Для реального кода: я использую ceres , который позволяет вам определять функторы с шаблонным скалярным типом для авто-дифференцирования. Скаляр оценивается как T и Jet<T, N>.

Ceres определяет operator<(const Jet<T, N>&, const T&), что позволяет jet < 0.0, но не jet < 0.

В моем коде я могу обойти эту проблему, используя двойные числа или явное приведение целых чисел к типу шаблона T, но когда я пытаюсь работать с complex<T>, у меня возникают проблемы с методами, которые сравниваются с целочисленными литералами, как метод _Div выше.

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Шаблон std::complex не требуется для работы с общими типами. Стандарт гласит [комплексное число] / 2:

Эффект создания шаблона complex для любого типа, кроме float, double или long double, не указан.

Если вам нужно обобщить любой другой числовой тип на сложный тип, вы должны использовать другую библиотеку или реализовать свою собственную.

0 голосов
/ 10 сентября 2018

Да, вы можете получить неявное преобразование, определив конструктор, который принимает один параметр (того типа, из которого вы преобразуете).

...