C++ C++;运算符重载:用户定义类型与浮点值的乘积
我尝试在4种情况下实现乘法运算符(C++ C++;运算符重载:用户定义类型与浮点值的乘积,c++,operator-overloading,binary-operators,C++,Operator Overloading,Binary Operators,我尝试在4种情况下实现乘法运算符(运算符*) 假设我有一个类雨 namespace manchester { namespace manchester_private_dont_use_this { template<typename T> class rain { public: rain(T initial_rain) : m_rain(initi
运算符*
)
假设我有一个类雨
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
再一次,我不确定,所以我想问可能比学错要好。我想到的四种情况是上面两种,然后当
float
的两个隐藏情况在T是type
double`的情况下可以转换为double,反之亦然。您可以直接使用double,让隐式converson来完成任务,但请注意,由于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);
}
inline rain操作符*(常数雨和常数雨,常数双)
{
返程雨(_rain.m_rain数量_rain*_t);
}
内联rain运算符*(常数双精度、常数雨和常数雨)
{
返程雨(_rain.m_rain数量_rain*_t);
}
另外,如果您试图避免特定的模板实例化,例如rain
,那么当有人试图这样做时,您可能会抛出编译错误。请参阅此处:好的,谢谢,我将按照您的建议查看抛出编译器错误的情况。在您刚才给出的示例中,您说过专门使用double可能会导致数据丢失?那么,你建议使用你给出的例子还是我给出的例子?如果你有雨,并且第二个参数是真双精度,那么数据就会丢失。这在你的例子和我的例子中都有,但在我给你的例子中,函数中仍然有double,如果你想避免数据的无损,可以做一些事情,在你的例子中,无损发生在函数本身的调用中。啊,对,我明白了。我建议继续使用我的示例,因为用户必须在使用float和double-one模板类型之间进行选择,因此会假设他们将使用为模板选择的相同类型进行所有运算。(无论如何我都会这么想!)
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);
}