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
, bind
và quote
. 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.
Câu trả lời rõ ràng và súc tích - đáng lẽ phải được OP chấp nhận. – etherice
Cảm ơn, rất vui khi được giúp đỡ! – TemplateRex