Đây là cách tiếp cận hoàn toàn hợp lệ để lưu trữ trình xử lý sự kiện.
Tuy nhiên, tôi muốn chỉ ra một số chi tiết liên quan đến chữ ký của hàm của bạn để thêm gọi lại. Bạn lo lắng về việc chuyển nó theo giá trị so với tham chiếu. Trong ví dụ của bạn, bạn hiện có:
void On(EventType OnEventType,std::function<void()>&& Callback)
Điều này là tốt, miễn là bạn sẽ chỉ bao giờ ràng buộc điều này với giá trị. Tuy nhiên, trừ khi có lý do cụ thể tại sao bạn muốn không cho phép, tôi khuyên bạn luôn có phương thức chấp nhận tham số theo giá trị hoặc tham chiếu lvalue và thêm phiên bản tham chiếu rvalue làm phần bổ sung nếu thấy cần thiết.
Không có một phương pháp mà phải mất một tài liệu tham khảo giá trị trái có nghĩa là mã của bạn hiện sẽ không biên dịch được đưa ra này:
std::function<void()> func([](){/*something clever*/});
// Do something necessary with func, perhaps logging or debug prints.
Button->On(EventType::Click, func);
Để đơn giản, bất cứ khi nào bạn đang lựa chọn như thế nào để vượt qua một giá trị, bạn chỉ có thể làm theo các hướng dẫn nói chung:
- Nếu bạn cần bản sao hoặc có ý định sửa đổi giá trị được gửi vào mà không muốn thay đổi đối tượng thực tế được chuyển: vượt qua giá trị.
- Nếu bạn dự định sửa đổi giá trị được gửi và muốn những thay đổi này ảnh hưởng đến đối tượng thực tế được chuyển: hãy chuyển theo tham chiếu.
- Nếu bạn không muốn thay đổi đối tượng được chuyển, nhưng tin rằng có lợi khi tránh sao chép: vượt qua tham chiếu const.
- Nếu bạn lấy tham số theo giá trị, tham chiếu hoặc tham chiếu const và tin rằng có tối ưu hóa có giá trị có thể đạt được bằng cách sử dụng kiến thức rằng thông số đầu vào là tạm thời: cũng cho phép chuyển qua tham chiếu rvalue.
Bạn có một số lỗi cú pháp ở đây. EventHolder trông giống như một struct nhưng được khai báo là enum. Ý của bạn là EventType là một enum? – Agentlien
Agentlien, vâng đó là một cấu trúc và là một lỗi đánh máy nhỏ. Cảm ơn. – Grapes
Nghĩ như vậy. :) Một mẹo cho tương lai: Hãy thử hoàn thành mã của bạn và thử biên dịch mã trước khi hoàn thành bài đăng. Bằng cách đó, bạn có cơ hội nhận được phản hồi chất lượng cao nhanh hơn trong khi câu hỏi vẫn còn mới.;) – Agentlien