2013-09-02 7 views
0

4 가지 상황에 대해 곱셈 연산자 (operator*)를 구현하려고합니다.C++ 연산자 오버로딩 : 부동 소수점 값으로 사용자 정의 유형 곱하기

나는 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>을 만들려고하지 못하도록 막을 수있는 최선의 방법입니다. 비가 리터 단위로 측정되기 때문에 많은 의미가 있습니다. 따라서 비 정수형 수량을 가질 수 있습니다.

어쨌든, 비의 양을 floatdouble으로 곱하는 경우에 대해 말한 것처럼 operator*을 구현해야했습니다. 이 유형들은 내재적으로 변환 될 수 있기 때문에 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 가지 상황은 위의 두 가지 였고 두 번째 숨겨진 사례는 float 일 때 double in the case whenis type double로 변환 될 수 있으며 그 반대의 경우도 마찬가지입니다.

답변

0

double을 직접 사용하여 암시 적 컨버전을 수행 할 수 있지만 float의 크기가 double보다 작기 때문에 데이터 손실이 발생할 수 있습니다. 누군가가 그렇게하려고하면 컴파일 오류가 발생 할 수 rain<int> 같은 특정 템플릿 인스턴스화를 피하기 위해 당신의 시도와

또한
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); 
} 

. 여기를 참조하십시오 : How to intentionally cause a compile-time error on template instantiation

+0

그래, 고마워, 내가 제안한 것처럼 컴파일러 오류를 던져 봐. 위 예제에서 방금 두 번 사용하면 데이터가 손실 될 수 있다고 말했습니까? 그런 다음 당신이 제안한 예나 내가 준 예를 사용 하시겠습니까? – user3728501

+0

데이터 손실은 비가 이고 두 번째 매개 변수가 실수 일 때 발생합니다. 그것은 당신의 예와 나의 것입니다. 그러나 제가 여러분에게 준 예제에서 함수의 이중 함수를 여전히 가지고 있으며, 무손실 데이터를 피하고자한다면 무언가를 할 수 있습니다. 예제에서 무손실은 다음과 같은 호출에서 발생합니다. 함수 자체. – hidrargyro

+0

아 맞습니다. 내 예제를 고집하는 것이 좋습니다. 왜냐하면 사용자는 float 템플릿 유형과 double 템플릿 유형을 선택해야하기 때문에 템플릿에 대해 선택한 것과 동일한 유형의 모든 산술 연산을 수행한다고 가정합니다. (나는 어쨌든 가정 할 것이다!) – user3728501