5

次のことを行うより良い方法はありますか?

次の関数を持つベクトル クラスがあります。

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他の比較のためにクラスも作成する必要があることに気付くまで、これはそれほど悪くはありませんでした。だから私の質問は、これを達成するためのより良い方法はありますか?

4

3 に答える 3

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

小さくて負でない整数値はすべて、それぞれの数値型で正確に表現できる必要があるため、単にstatic_cast目的の型に 'ing するだけで十分です。

または、 が 2 つの型のパラメーター(たとえば as )IsAlmostEqualを持つ静的メンバー関数であると仮定すると、関数呼び出しでコンパイラーに自動的に変換を実行させるだけです。TIsAlmostEqual(T lhs, T rhs)

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