Перегрузка оператора C ++: умножение определяемого пользователем типа на значения с плавающей запятой

Я пытаюсь реализовать операторы умножения (operator*) для 4 ситуаций.

Представь, что у меня есть class rain,

namespace manchester {

namespace manchester_private_dont_use_this {

template<typename T>
class rain
{

public:
rain(T initial_rain)
: m_rain(initial_rain)
{
}

private:
T m_quantity_of_rain;
};

}

} //namespace manchester

Предположим, этот класс объявлен внутри частного пространства имен. typedef rain<float> rainf; а также typedef rain<double> raind раскрыть функциональность этого класса в не приватном пространстве имен. Под частным пространством имен я подразумеваю другое вложенное пространство имен, которое называется что-то вроде namespace rainprivate_do_not_use_me, (В примере я фактически добавил два пространства имен, чтобы объяснить, о чем я говорю, но это не очень важно.) Это лучшее, что я мог придумать, чтобы предотвратить попытки конечного пользователя (меня) создать rain<int> что не имеет большого смысла, так как дождь измеряется в литрах, и, следовательно, мы можем иметь нецелые количества.

Во всяком случае, я должен был реализовать operator* как я уже сказал, для случая умножения количества дождя на float и double, Правильно ли я предположил, что, поскольку эти типы могут быть неявно преобразованы, мне нужно только реализовать оператор, где переменная rhs является double и где переменная lhs является double, (Под двойным я на самом деле имею в виду тип, T.)

Опять же, я предполагаю здесь — см. Мой предыдущий вопрос об унарных операторах, но я предполагаю что-то вроде этого: (Опять же, я не смог найти какую-либо информацию о SO, чтобы ответить на мой вопрос.)

// friend function:
inline rain<T> operator*(const rain<T>& _rain, const T _t)
{
return rain<T>(_rain.m_quantity_of_rain * _t);
}

inline rain<T> operator*(const T _t, const rain<T>& _rain)
{
return rain<T>(_rain.m_quantity_of_rain * _t);
}

Опять же, я не был уверен, поэтому подумал, что лучше спросить, чем выучить это неправильно. Четыре ситуации, о которых я думал, были две выше, а затем два скрытых случая, когда float может быть преобразован в двойнойin the case whenTis typedouble` и наоборот.

0

Решение

Вы можете напрямую использовать double и позволить неявному разговору выполнить задачу, но учтите, что, поскольку float меньше по размеру, чем double, это может привести к потере данных.

inline rain<T> operator*(const rain<T>& _rain, const double _t)
{
return rain<T>(_rain.m_quantity_of_rain * _t);
}

inline rain<T> operator*(const double _t, const rain<T>& _rain)
{
return rain<T>(_rain.m_quantity_of_rain * _t);
}

также с вашей попыткой избежать конкретного экземпляра шаблона, как rain<int> Вы можете выдать ошибку компиляции, когда кто-то попытается это сделать. Пожалуйста, обратитесь сюда: Как намеренно вызвать ошибку во время компиляции при создании шаблона

0

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

Других решений пока нет …

По вопросам рекламы [email protected]