有更好的方法可以做到以下几点吗?
我有一个矢量类,具有以下功能:
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
类以及其他比较之前,这还不算太糟糕。所以我的问题是,有没有更好的方法来实现这个目标?
答案 0 :(得分:8)
return IsAlmostEqual(this->GetLength(), static_cast<T>(1));
每个数字类型都应该可以精确地表示小的非负整数值,因此只需static_cast
'到所需的类型就足够了。
或者,假设IsAlmostEqual
是一个静态成员函数,它有两个类型T
的参数(例如IsAlmostEqual(T lhs, T rhs)
),只需让编译器在函数调用中自动执行转换:
return IsAlmostEqual(this->GetLength(), 1);
答案 1 :(得分:0)
为什么不让编译器进行转换工作
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>();
}
不确定语法是否正确,但这是一般的想法。
答案 2 :(得分: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