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>
(例では、私が話していることを説明するために実際に 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 つの隠れたケースがfloat
double in the case when
T is type
double` に変換される場合と、その逆の場合です。