Есть ли лучший способ сделать следующее?
У меня есть векторный класс со следующей функцией:
template <typename T>
bool Vector3<T>::IsUnitVector() const
{
return IsAlmostEqual(this->GetLength(), One<T>::Value());
}
Поскольку T может быть float или double (я использую явное создание экземпляра шаблона, чтобы убедиться, что поддерживаются только эти типы), мне пришлось создать вспомогательный класс, который возвращает значение 1, в правильном типе:
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; }
};
Это было не так уж плохо, пока я не понял, что мне нужно создать Zero
класс, а также для других сравнений. Итак, мой вопрос, есть ли лучший способ добиться этого?
return IsAlmostEqual(this->GetLength(), static_cast<T>(1));
Маленькие неотрицательные целочисленные значения должны быть точно представлены каждым из числовых типов, поэтому просто static_cast
До нужного типа должно быть достаточно.
В качестве альтернативы, предполагая, IsAlmostEqual
статическая функция-член, имеющая два параметра типа T
(например, как IsAlmostEqual(T lhs, T rhs)
), просто дайте компилятору выполнить преобразование автоматически при вызове функции:
return IsAlmostEqual(this->GetLength(), 1);
Почему бы просто не позволить компилятору выполнить преобразование
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>();
}
не уверен, что синтаксис правильный, но это общая идея.
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