次の 2 つの使用シナリオを考慮してください (ご覧のとおり、つまり、エンド ユーザーは と の使用のみに関心がVector2_t
ありますVector3_t
)。
[1]継承:
template<typename T, size_t N> struct VectorBase
{
};
template<typename T> struct Vector2 : VectorBase<T, 2>
{
};
template<typename T> struct Vector3 : VectorBase<T, 3>
{
};
typedef Vector2<float> Vector2_t;
typedef Vector3<float> Vector3_t;
[2]専門:
template<typename T, size_t N> struct Vector
{
};
template<typename T> struct Vector<T, 2>
{
};
template<typename T> struct Vector<T, 3>
{
};
typedef Vector<float, 2> Vector2_t;
typedef Vector<float, 3> Vector3_t;
どちらがより良い解決策であるかについて、私は決心できません。継承の明らかな利点は、派生クラスでのコードの再利用です。パフォーマンスが不利になる可能性があります (サイズが大きい、ユーザーが値を渡す可能性があるなど)。専門化はそれをすべて回避しているように見えますが、私は自分自身を何度も繰り返さなければならないという犠牲を払っています.
他に見逃した長所/短所はありますか? また、あなたの意見では、どのルートを選択する必要がありますか?