неявное преобразование — заставить C ++ автоматически конвертировать int в double

Когда у меня есть числовой тип, который определяет operator< для двойного, но не для 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.

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


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

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

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

3

Решение

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

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

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

5

Другие решения

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector