Xét theo hai kịch bản sử dụng sau đây (chính xác như bạn nhìn thấy chúng, có nghĩa là, người dùng cuối sẽ chỉ quan tâm đến việc sử dụng Vector2_t
và Vector3_t
):Inheritance vs Chuyên
[1] Inheritance:
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] Chuyên ngành:
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;
tôi không thể làm cho tâm trí của tôi như là một giải pháp đẹp hơn. Lợi thế rõ ràng đối với thừa kế là sử dụng lại mã trong các lớp dẫn xuất; một bất lợi có thể là hiệu suất (kích thước lớn hơn, người dùng có thể vượt qua theo giá trị, vv). Chuyên ngành dường như tránh tất cả những điều đó, nhưng với chi phí phải tự mình lặp lại nhiều lần.
Tôi đã bỏ lỡ những ưu điểm/nhược điểm nào khác và theo ý kiến của bạn, tôi nên đi tuyến đường nào?
câu trả lời hoàn chỉnh nhất. Cảm ơn bạn! –
Câu trả lời tuyệt vời và COOL. Đưa một guru để có được một câu trả lời thanh lịch như vậy. –
+1. Tôi nghi ngờ đề xuất của bạn về enable_if <> trong một mẫu lớp đơn là cách tốt nhất - chắc chắn sự khác biệt duy nhất giữa các lớp mẫu cho các tham số vector khác nhau sẽ là số tham số trong hàm tạo? –