Description
proto::pack
is useful within
CallableTransforms and
ObjectTransforms when one wishes to unpack an expression
into a function call or an object constructor. proto::pack
turns a Proto expression into a pseudo-parameter pack, which may appear in an unpacking
pattern to be expanded with the "...
" syntax.
Пример:
struct do_sum : proto::callable
{
typedef int result_type;
int operator()(int i) const { return i; }
int operator()(int i, int j) const { return i + j; }
int operator()(int i, int j, int k) const { return i + j + k; }
};
struct sum
: proto::when<
proto::nary_expr<_, proto::vararg<proto::terminal<int> > >
, do_sum(proto::_value(proto::pack(_))...)
>
{};
int main()
{
proto::terminal<int>::type i = {42};
int result = sum()( i(3,5) );
std::cout << "Sum of 42, 3, and 5 : " << result << std::endl;
}
Вышеупомянутая программа отображает:
Sum of 42, 3, and 5 : 50
В приведенном выше примере тип proto::_value(proto::pack(_))
представляет собой так называемый unpacking pattern, описанный ниже.
Unpacking Patterns:
Композитные преобразования (либо CallableTransforms, либо ObjectTransforms) обычно имеют форму X(A0,…An)
. Однако, когда список аргументов в композитном преобразовании завершается эллипсисом варарга в стиле С, как в X(A0,…An...)
, окончательный аргумент An
трактуется как распаковочный шаблон.
Образец распаковки сам по себе должен быть составным преобразованием; то есть это должен быть тип функции, представляющий либо CallableTransform, либо ObjectTransform. Тип proto::pack(_)
должен появиться ровно один раз в шаблоне распаковки. Этот тип получит замену при расширении распаковочного шаблона.
Композитное преобразование, подобное X(A0,…An...)
, при оценке по заданному выражению E
, состоянию и данным, оценивается как если бы оно было X(A0,…An-1,S
, где S
представляет собой последовательность типов, вычисленную следующим образом:
Пусть SUB
(A,B)
быть функцией типа, которая заменяет каждое появление proto::pack(_)
в A
на B
.
- Если выражение
E
является терминалом (т.е. оно имеет плотность 0), S
представляет собой одноэлементную последовательность, содержащую SUB
(An, proto:_value)
.
- Если выражение
E
является нетерминальным, S
является последовательностью SUB
(An, proto::_child_cSUB
(An, proto::_child_c<M
является аритмией выражения E
).