Tôi đang trong quá trình tạo lớp vectơ và đang cố gắng tìm cách sử dụng lại số lượng mã tối đa cho các vectơ có kích thước khác nhau. Dưới đây là một ví dụ cơ bản:Chuyển cấu trúc tạm thời làm đối số mẫu
template<typename T, unsigned int D>
class Vector
{
public:
union {
T v[D];
struct {
/* T x;
* T y;
* T z;
* T w;
*/
};
};
Vector()
{
for(unsigned int i=0; i<D; ++i)
(*this)[i] = T(0);
}
Vector(T scalar)
{
for(unsigned int i=0; i<D; ++i)
(*this)[i] = scalar;
}
inline T operator[](int i) { return (*this).v[i]; }
};
Tôi muốn các biến thành viên để có thể truy cập công khai. Ví dụ:
Vector<float,2> vec;
printf("X: %.2f, Y: %.2f\n", vec.x, vec.y);
Những gì tôi muốn làm là một cái gì đó dọc theo dòng này:
template<typename T>
class Vector2 : public Vector<T,2, struct { T x; T y; }> {};
template<typename T>
class Vector3 : public Vector<T,2, struct { T x; T y; T z; }> {};
và có nó ghi đè lên một struct trong đoàn:
template<typename T, unsigned int D, struct C>
class Vector
{
public:
union {
T v[D];
// Place the passed struct here
};
};
Có bất kỳ cách khả thi để làm điều này? Tôi không muốn sử dụng bất cứ thứ gì ngoài thư viện chuẩn nếu có thể. Cảm ơn trước.
EDIT: Sau khi đọc tất cả các câu trả lời, tôi hiểu rằng cách tôi đang sử dụng công đoàn không chính xác! Cảm ơn bạn @ M.M đã chỉ ra điều này. Tôi đã chọn để đi một con đường khác, nhưng tôi đã chọn câu trả lời phù hợp nhất với những gì tôi đang tìm kiếm vào thời điểm đó. Một lần nữa, cảm ơn bạn vì tất cả các phản hồi được hoan nghênh dưới đây!
bạn có thực sự muốn * * để vượt qua các cấu trúc trong cho 'Vector' hay làm bạn chỉ muốn một cách để xác định Vector2/3/4 tạo ra kết quả cuối cùng? Lớp này dường như không hữu ích cho các kích thước> 6-8. Ngoài ra bạn không muốn 'T (0)' trong ctor của bạn, bạn muốn 'T {}' để mặc định khởi tạo nó. – kfsone
Không hoàn toàn chắc chắn những gì bạn đang làm, nhưng lưu ý rằng trong C++ chỉ thành viên được chỉ định gần đây nhất của một công đoàn có thể được đọc; ví dụ. không được phép ghi vào 'v' rồi đọc từ' x'. –
Điều gì @MM cho biết thực sự quan trọng! Không sử dụng 'union' để" chuyển đổi "một giá trị khác. Hãy xem xét 'std :: tuple' và quá tải của' operator [] 'để đạt được những gì bạn muốn làm – Garf365