Я пытаюсь реализовать операторы умножения (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 when
Tis type
double` и наоборот.
Вы можете напрямую использовать 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>
Вы можете выдать ошибку компиляции, когда кто-то попытается это сделать. Пожалуйста, обратитесь сюда: Как намеренно вызвать ошибку во время компиляции при создании шаблона
Других решений пока нет …