Trong một thời gian tôi đã nhầm lẫn về hướng quá tải của toán tử D, nhưng bây giờ tôi nhận ra đó là một hệ thống đẹp ... nếu nó chỉ hoạt động với các loại lõi (int, float, vv). Hãy xem xét mã sau:Quá tải nhà điều hành thanh lịch trong D
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
X.opOpAssign!op(vector.X); // ERROR: no property "opOpAssign" for float
Y.opOpAssign!op(vector.Y); // ERROR: ditto
}
}
Đây sẽ là mã đẹp nếu nó hoạt động, khi nó quá tải tất cả các toán tử + =, - =, * =, v.v. Tuy nhiên, như bạn thấy, nó không hoạt động ra khỏi hộp. Tôi đã tạo giải pháp bằng cách sử dụng các mẫu (god I love D):
template Op(string op, T) {
void Assign(ref T a, T b) {
static if (op == "+") a += b;
else if (op == "-") a -= b;
else if (op == "*") a *= b;
else if (op == "/") a /= b;
}
}
struct Vector {
float X, Y;
void opOpAssign(string op)(Vector vector) {
Op!(op, typeof(X)).Assign(X, vector.X);
Op!(op, typeof(Y)).Assign(Y, vector.Y);
}
}
Điều này là tốt, chỉ muốn tôi giữ mọi thứ "trong nhà". Có cách nào để thực hiện công việc này mà không cần sự trợ giúp của mẫu không? Tôi biết tôi đang cầu kỳ ở đây, thấy rằng không có mất hiệu suất và không khó để nhập một mô-đun trong tình huống tôi cần phải làm điều này. Tôi chỉ tự hỏi nếu nó được xây dựng trong và tôi đang nhìn cái gì đó.
Lưu ý rằng 'if' tĩnh không được tiếp tục sau 'if's sau' else'. Bạn phải lặp lại 'static' một lần nữa. – Bolpat