У меня есть класс Vector
, который представляет 2D-вектор. Он создан по шаблону, позволяющему использовать любой числовой тип для компонентов x и y. Например, один из перегруженных арифметических операторов — *
для умножения вектора на скаляр:
template <typename T, typename U>
inline const Vector<T> operator*(const Vector<T>& vector, U scalar) {
return Vector<T>(vector.x * scalar, vector.y * scalar);
}
(У меня также есть функция с параметрами в обратном порядке, чтобы разрешить scalar * Vector
в дополнение к Vector * scalar
).
Как видите, я использую <T, U>
вместо простого <T>
, чтобы скаляр не обязательно был того же типа, что и вектор. Когда я не сделал этого, неожиданно Vector<double> * int
не компилировался (я думал, что int автоматически расширится).
В любом случае, я не просто хочу вернуть Vector<T>
. Я хочу имитировать встроенные типы и возвращать то, что имеет более высокую точность, T
или U
. Так, например, Vector<int> * double => Vector<double>
, а Vector<double> * short => Vector<double>
.
Это возможно?