Vấn đề với mixin là ... xây dựng.
class Base1 { public: Base1(Dummy volatile&, int); };
class Base2 { public: Base2(Special const&, Special const&); };
Và bây giờ, siêu mixin tôi:
template <typename T>
struct Mixin: T {};
Bạn có nhận thấy vấn đề ở đây? Làm thế nào địa ngục tôi phải vượt qua các đối số cho các nhà xây dựng của lớp cơ sở? Loại constructor nào cần Mixin
đề xuất?
Đó là một vấn đề khó khăn và chưa được giải quyết cho đến khi C++ 11 nâng cao ngôn ngữ để nhận được chuyển tiếp hoàn hảo.
// std::foward is in <utility>
template <typename T>
struct Mixin: T {
template <typename... Args>
explicit Mixin(Args&&... args): T(std::forward<Args>(args...)) {}
};
Lưu ý: kiểm tra đôi được chào đón
Vì vậy tại chúng ta thực sự có thể sử dụng mixins ... và chỉ cần phải thay đổi thói quen người :)
Tất nhiên, cho dù chúng tôi thực sự muốn trở thành một chủ đề hoàn toàn khác.
Một trong những vấn đề với mixin (bài viết bạn tham khảo vui vẻ bỏ qua) là cách ly phụ thuộc bạn hoàn toàn mất ... và thực tế là người dùng LoggingTask
sau đó bị ràng buộc để viết các phương thức mẫu. Trong các cơ sở mã rất lớn, sự chú ý nhiều hơn được trao cho các phụ thuộc hơn là hiệu năng, bởi vì các phụ thuộc ghi chu kỳ của con người trong khi hiệu suất chỉ ghi chu kỳ CPU ... và những cái đó thường rẻ hơn.
Nguồn
2012-01-06 09:35:31
Các ngôn ngữ JIT có thể mạnh mẽ như C++ cho tất cả trừ các ứng dụng * xử lý nhiều nhất *. – GManNickG
@GMan: Tôi nghĩ rằng tham chiếu JIT không liên quan đến câu hỏi.Đó là một câu hỏi hay - đó là một mẫu thiết kế thú vị mà tôi chưa từng thấy ở bất kỳ cơ sở mã nào mà tôi đã từng làm việc. – Skizz
@Skizz: Hoàn toàn không liên quan, tôi đồng ý; nhưng nó ở đó. – GManNickG