0

我正在尝试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*像我说的那样实现,以将雨量乘以 afloat和 a double。我是否正确假设因为这些类型可以隐式转换,所以我只需要实现一个运算符,其中 rhs 变量是 adouble并且 lhs 变量是 a 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);
}

再一次,我不确定,所以认为问比学错可能更好。我想到的4种情况就是上面的两种,然后是when的两种隐藏情况float可以转换成double in the case whenT is typedouble`,反之亦然。

4

1 回答 1

0

您可以直接使用 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);
}

还与您尝试避免特定模板实例化一样,例如rain<int>当有人尝试这样做时您可能会抛出编译错误。请参考这里:如何在模板实例化时故意导致编译时错误

于 2013-09-03T00:32:03.447 回答