Есть два решения для этого.В Pre C ++ 11 вы можете написать шаблон, например:
template <typename T, typename U>
struct WhatWillItBe {
typedef T result_t;
};
template <typename T>
struct WhatWillItBe<T, double> {
typedef double result_t;
};
// ... lots more
и т. Д.и напишите много специализаций, затем вы можете использовать это для поиска типа возвращаемого значения, например:
template <typename T, typename U>
inline const Vector<typename WhatWillItBe<T,U>::result_t> operator*(const Vector<T>& vector, U scalar) {
return Vector<typename WhatWillItBe<T,U>::result_t>(vector.x * scalar, vector.y * scalar);
}
В качестве альтернативы C ++ 11 делает это простым, вы можетенапишите auto
для типа возвращаемого значения и используйте ->
, чтобы указать тип возвращаемого значения после остальной части функции:
template <typename T, typename U>
inline auto operator*(const Vector<T>& vector, U scalar) -> Vector<decltype(vector.x*scalar)> {
return Vector<decltype(vector.x*scalar)>(vector.x * scalar, vector.y * scalar);
}
, который позволяет использовать decltype
для возвращаемого типа функции,установив его в зависимости от того, что произойдет для продвижения, естественно, с помощью vector.x * scalar
.