2012-04-23 31 views
11

Tôi hiện đang thực hiện một số bằng chứng về các mẫu khái niệm với boost :: mpl và có một số khó khăn trong việc hiểu cách hàm lambda cho phép sử dụng trình giữ chỗ.Tăng giữ chỗ MPL và Lambda

Tôi nhận ra rằng tôi có thể bọc các siêu dữ liệu trong các lớp siêu dữ liệu để cho phép các hàm bậc cao hơn có thể truy cập chức năng lồng nhau, và nhận ra rằng bạn có thể tránh được nỗ lực này bằng cách sử dụng mpl :: lambda. chủ sở hữu.

Điều này thực sự hoạt động như thế nào? Tôi đang gặp khó khăn trong đầu của tôi xung quanh những gì lamda và placeholders thực sự làm dưới sự bảo hiểm.

Trả lời

13

Xem Boost.MPL manual: trình giữ chỗ là lớp siêu dữ liệu có dạng mpl::arg<X>. Một lớp metafunction là một lớp có chứa một giao thức apply.

template <int N> struct arg; // forward declarations 
struct void_; 

template <> 
struct arg<1> 
{ 
    template < 
     class A1, class A2 = void_, ... class Am = void_> 
    struct apply 
    { 
     typedef A1 type; // return the first argument 
    }; 
}; 
typedef arg<1> _1 

Đây là công việc của mpl::lambda để biến biểu thức trình giữ chỗ thành các lớp siêu dữ liệu. Này được thực hiện bằng cách nhúng một lớp metafunction như this:

template< 
     typename X 
    , typename Tag = unspecified 
    > 
struct lambda 
{ 
    typedef unspecified type; 
}; 

Nếu x là một biểu thức giữ chỗ trong một hình thức chung X<a1,...an>, nơi X là một lớp học mẫu và a1,... an nhiều loại tùy ý, các không xác định kiểu nhúng f tương đương với

typedef protect< bind< 
     quoten<X> 
    , lambda<a1>::type,... lambda<an>::type 
> > f; 

nếu không, f giống hệt với X. Giao thức apply đánh giá biểu thức lambda bằng cách truy cập loại được nhúng.

Trong MPL manual bạn cũng có thể tra cứu các định nghĩa của protect, bindquote. Họ là tất cả hàm bao quanh các đối số của họ để trì hoãn việc đánh giá càng lâu càng tốt.

+0

Câu trả lời rõ ràng và súc tích - đáng lẽ phải được OP chấp nhận. – etherice

+0

Cảm ơn, rất vui khi được giúp đỡ! – TemplateRex

Các vấn đề liên quan