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).