簡體   English   中英

C ++運算符重載:用戶定義類型乘以浮點值

[英]C++ Operator Overloading : Multiplication of User Defined Type by floating point values

我正在嘗試為4種情況實現乘法運算符( operator* )。

想象我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在非私有名稱空間中公開了typedef rain<double> raind的功能。 私有名稱空間是指另一個嵌套的名稱空間,稱為namespace rainprivate_do_not_use_me (在示例中,我實際上添加了兩個名稱空間來解釋我在說什么,但這並不是很重要。)這是我能想到的最好的方法,可以防止最終用戶(me)嘗試創建rain<int>這沒有多大意義,因為雨水的單位是升,因此我們可以得到非整數的量。

無論如何,我要像我說的那樣實現operator* ,以便將雨量乘以floatdouble 我是否正確假設,因為可以隱式轉換這些類型,所以我只需要實現一個運算符,其中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);
}

再次,我不確定,因此認為提出問題可能比錯誤學習更好。 我想到的4種情況是上述兩種情況,然后in the case when T is type double is type in the case when下, float的兩個隱藏情況可以轉換為double in the case when反之亦然。

您可以直接使用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> ,當有人嘗試這樣做時可能會引發編譯錯誤。 請參考此處: 如何故意在模板實例化上導致編譯時錯誤

C ++ &lt;

[英]C++ <<operator overloading with same type

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM