5

有没有更好的方法来执行以下操作?

我有一个矢量类,具有以下功能:

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

由于 T 可以是浮点型或双精度型(我使用显式模板实例化来确保仅支持这些类型),因此我必须创建一个帮助器类,它以正确的类型返回值 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类来进行其他比较。所以我的问题是,有没有更好的方法来实现这一目标?

4

3 回答 3

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

小的非负整数值都应该可以由每种数字类型精确表示,因此只需static_cast' 到所需的类型就足够了。

或者,假设IsAlmostEqual是一个静态成员函数,它有两个类型的参数T(例如 as IsAlmostEqual(T lhs, T rhs)),只需让编译器在函数调用中自动执行转换:

return IsAlmostEqual(this->GetLength(), 1);
于 2012-11-02T14:39:17.760 回答
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>();
}

不确定语法是否正确,但这就是一般的想法。

于 2012-11-02T14:42:09.513 回答
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
于 2012-11-02T14:43:51.100 回答