2012-11-02 4 views
5

다음 작업을 수행하는 더 좋은 방법이 있습니까?템플릿 유형과 상수 값 비교

나는 다음과 같은 기능을, 벡터 클래스가 :

template <typename T> 
bool Vector3<T>::IsUnitVector() const 
{ 
    return IsAlmostEqual(this->GetLength(), One<T>::Value()); 
} 

T는 플로트 또는 더블 (I은 이러한 유형이 지원됩니다 확인하기 위해 명시 적 템플릿 인스턴스화를 사용하고), 내가했습니다 될 수 올바른 유형에서 1의 값을 반환하는 도우미 클래스를 생성했다 : 나는 다른 비교뿐만 아니라 Zero 클래스를 만들 필요가 실현 될 때까지

template <typename T> 
struct One 
{ 
    static T Value(); 
}; 

template <> 
struct One<int> 
{ 
    static int Value() { return 1; } 
}; 

template <> 
struct One<float> 
{ 
    static float Value() { return 1.0f; } 
}; 

template <> 
struct One<double> 
{ 
    static double Value() { return 1.0; } 
}; 

이 너무 나쁘지 않았다. 그래서 제 질문은, 이것을 달성하는 더 좋은 방법이 있습니까?

+1

나는 이것이 매우 일반적이라고 생각합니다. 'One '의 비 특화 버전에서'return 1; '이라고 말하려고 했습니까? 나는 암묵적인 변환 덕분에 그렇게 할 것이라고 생각한다. – leemes

+0

IsAlmostEqual이 템플릿 화 되었기 때문에 컴파일러는 사용할 형식을 알지 못합니다 (int는 float, double 등으로 변환 될 수 있기 때문에). –

답변

8
return IsAlmostEqual(this->GetLength(), static_cast<T>(1)); 

작고 음수가 아닌 정수 값은 모두 매우 바람직한 형태에 보내고 단순히 static_cast '이 충분해야, 숫자 타입 각각에 의해 정확하게 표현할 수 있어야한다.

return IsAlmostEqual(this->GetLength(), 1); 
+0

컴파일러에서 모호한 형식 T 오류가 발생하므로 암시 적 변환이 작동하지 않습니다. static_cast 그래도 작동합니다! –

+0

답변 - 'static_cast '제안에 동의 함. 감사! –

0

왜 그냥 내버려 :

달리, IsAlmostEqual 가정하면 (예 IsAlmostEqual(T lhs, T rhs) 같은) 유형 T 두 매개 변수가 고정 부재 함수 단순히 컴파일러는 함수 호출에 자동 변환을 수행 할 수있다 컴파일러는 변환 작업을 수행합니다.

template<typename T, int val> 
bool Vector3<T>::_isConstant()const{ 
    return IsAlmostEqual(this->GetLength(), val); 
} 

template <typename T> 
bool Vector3<T>::IsUnitVector() const{ 
    return _isConstant<T,1>(); 
} 
template<typename T> 
bool Vector3<T>::IsZeroVector()const{ 
    return _isConstant<T,0>(); 
} 

구문이 맞는지 확실하지 않지만 일반적인 생각입니다.

0
template <typename T> 
struct Value 
{ 
    static T Zero(); 
    static T One(); 
}; 

template <> 
struct Value<int> 
{ 
    static int Zero() { return 0; } 
    static int One() { return 1; } 
}; 
// .. and so on