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>
을 만들려고하지 못하도록 막을 수있는 최선의 방법입니다. 비가 리터 단위로 측정되기 때문에 많은 의미가 있습니다. 따라서 비 정수형 수량을 가질 수 있습니다.
어쨌든, 비의 양을 float
과 double
으로 곱하는 경우에 대해 말한 것처럼 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 when
is type
double로 변환 될 수 있으며 그 반대의 경우도 마찬가지입니다.
그래, 고마워, 내가 제안한 것처럼 컴파일러 오류를 던져 봐. 위 예제에서 방금 두 번 사용하면 데이터가 손실 될 수 있다고 말했습니까? 그런 다음 당신이 제안한 예나 내가 준 예를 사용 하시겠습니까? – user3728501
데이터 손실은 비가이고 두 번째 매개 변수가 실수 일 때 발생합니다. 그것은 당신의 예와 나의 것입니다. 그러나 제가 여러분에게 준 예제에서 함수의 이중 함수를 여전히 가지고 있으며, 무손실 데이터를 피하고자한다면 무언가를 할 수 있습니다. 예제에서 무손실은 다음과 같은 호출에서 발생합니다. 함수 자체. –
hidrargyro
아 맞습니다. 내 예제를 고집하는 것이 좋습니다. 왜냐하면 사용자는 float 템플릿 유형과 double 템플릿 유형을 선택해야하기 때문에 템플릿에 대해 선택한 것과 동일한 유형의 모든 산술 연산을 수행한다고 가정합니다. (나는 어쨌든 가정 할 것이다!) – user3728501