Умножение вектора на скаляр и приведение типов (C ++) - PullRequest
0 голосов
/ 21 июня 2020

Я реализую вектор в трехмерном пространстве: {u, v, w}. Я хочу перегрузить оператор *, чтобы была возможна следующая операция: ResultVector = скаляр * Vector . В этом выражении я предположил, что тип, содержащийся в ResVector , является наиболее общим между типом скаляра и типом, содержащимся в Vector . Например, я ожидаю следующих преобразований типов:

int * vector<float> -> vector<float>

complex<float> * vector<float> -> vector<complex>

и так далее. Но я вижу, что моя перегрузка оператора * не работает должным образом. Итак, как мне определить оператор *, чтобы обеспечить преобразование типов, упомянутых выше и других? Скалярный. Более того, оператор * не может использоваться так

Vector3<float> vec1(1, 2, 3);
Vector3<float> vec5(2 * vec1);

, так как соответствующее приведение типов не существует или оператор *, принимающий соответствующие типы, не определен. Но если я определю оператор * следующим образом

template <typename Scalar, typename Multiplier=Scalar>
Vector3<Scalar> operator*(Multiplier number, const Vector3<Scalar>& vec1)
{
    Vector3<Scalar> tmp(vec1);
    tmp *= number;
    return tmp;
}

, тогда возможен вариант использования, упомянутый выше. Зачем? Как это работает?

...