У меня есть класс Vector
, который представляет собой 2D-вектор. Предусматривается использование любого численного типа для компонентов x и y. В качестве примера, один из арифметических операторов я перегрузкой *
для умножения вектора с скаляром:C++ арифметический оператор перегрузки-автоматическое расширение?
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>
.
Возможно ли это?
Удивительно, хотелось бы, чтобы я мог возвыситься не один раз. Я все время вижу хорошие приложения синтаксиса типа '->' return type. –
Отмечая, конечно, что в C++ 11 ваш возвращаемый тип _shouldn't_ будет const, поскольку он препятствует семантике перемещения. – ildjarn
Поддерживает ли это clang ++ 3.0? – mk12