Tôi đã sử dụng một cái gì đó như sau để soạn chính sách cho ứng dụng của tôi:Làm thế nào để sử dụng boost :: mpl để soạn chính sách?
Các lớp chính sách giống như thế này:
struct Policy {
static void init();
static void cleanup();
//...
};
template <class CarT, class CdrT>
struct Cons {
static void init() {
CarT::init();
CdrT::init();
}
static void cleanup() {
CdrT::cleanup();
CarT::cleanup();
}
//...
};
Để soạn chính sách:
typedef Cons<Policy1, Cons<Policy2, Cons<Policy3, Policy4> > > MyPolicy;
Để sử dụng MyPolicy:
init_with<MyPolicy>(...);
//...
cleanup_with<MyPolicy>(...);
nơi họ sẽ gọi:
MyPolicy::init_options(); // calls Policy1 to 4's init in order
và
MyPolicy::cleanup(); // calls Policy1 to 4's cleanup in reverse order
Về cơ bản, Nhược điểm xây dựng một danh sách loại ở đây. Nó khá thẳng về phía trước. Tuy nhiên dòng consedef cons là kinda xấu xí. Nó sẽ là lý tưởng để có bộ kết hợp chính sách có thể làm điều này:
typedef CombinePolicy<Policy1, Policy2, Policy3, Policy4> MyPolicy;
Kể từ khi chúng ta có thể có số lượng tùy ý các chính sách, các CombinePolicy sẽ cần mẫu hỗ trợ variadic trong C++ 0x, mà chỉ có sẵn nghiệm trong việc cắt giảm biên dịch cạnh. Tuy nhiên, có vẻ như là tăng: thư viện mpl giải quyết/làm việc xung quanh vấn đề bằng cách sử dụng một thủ thuật tiền xử lý bó. Tôi đoán tôi có thể sử dụng một cái gì đó như:
typedef mpl::list<Policy, Policy2, Policy3, Policy4> Policies;
và sau đó gọi:
init_with<Policies>(...);
mà sau đó sẽ sử dụng:
typedef iter_fold<Policies, begin<Policies>::type,
some_magic_lambda_expression>::type MyPolicy;
Rõ ràng, tôi có một chút rắc rối tìm ra some_magic_lambda_expression tại đây. Tôi chắc rằng nó khá tầm thường đối với các chuyên gia mpl ở đây.
Xin cảm ơn trước.
Có một lỗi nhỏ trong ví dụ của bạn. Điều này có thể làm cho ví dụ. Tôi có thể sử dụng for_each cho mỗi phương pháp. Nhưng những gì tôi thích có một chính sách kết hợp có thể được thông qua xung quanh, nghĩa là, tôi thích thứ tự được thực thi tại thời gian biên dịch hơn là thời gian chạy với for_each. – ididak
Như tôi thấy, bạn chỉ có thể gọi các metafunctions tại thời gian biên dịch, tôi không thấy cách gọi init_options() hoặc bất kỳ hàm thuần nào khác tại thời gian biên dịch. Tôi hiểu rằng bạn muốn tự động áp dụng tất cả các Chính sách trong danh sách Chính sách bằng cách gọi init_with khi chạy, đó là những gì for_each thực hiện. xin vui lòng làm rõ – tabdamage
Mục đích là để soạn một lớp chính sách tại thời gian biên dịch với lệnh được thực thi như trong ví dụ ban đầu của tôi và các phương thức thực sự được gọi vào thời gian chạy như MyCombinedPolicy :: init_options() v.v. – ididak