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_merain<int>(例では、私が話していることを説明するために実際に 2 つの名前空間を追加しましたが、それはそれほど重要ではありません。) これは、エンド ユーザー (私) が作成しようとすることを防ぐために思いつくことができる最善の方法です。雨はリットルで測定されるため、整数ではない量を持つことができるため、非常に理にかなっています。

とにかく、operator*雨量に afloatと a の両方を掛ける場合は、私が言ったように実装することでしたdouble。これらの型は暗黙的に変換できるため、 rhs 変数が adoubleであり、 lhs 変数が a である演算子のみを実装する必要があると仮定して正しいでしょうかdouble。(double とは、実際には型 T を意味します。)

繰り返しますが、私はここで推測しています - 単項演算子に関する以前の質問を参照してください。

// 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 つの状況は、上記の 2 つと、when の 2 つの隠れたケースがfloatdouble in the case whenT is typedouble` に変換される場合と、その逆の場合です。

4

1 に答える 1

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>、誰かがそれを試みたときにコンパイル エラーが発生する可能性があります。ここを参照してください:テンプレートのインスタンス化で意図的にコンパイル時エラーを発生させる方法

于 2013-09-03T00:32:03.447 に答える