El hermano mayor del Mensajero es el parámetro de recolección, cuyo trabajo es capturar información sobre la función a la que es pasado. Generalmente se usa cuando el parámetro de recolección se pasa a múltiples funciones; es como una abeja recogiendo polen.
Un contenedor (container) es un parámetro de recolección especialmente útil, ya que está configurado para añadir objetos dinámicamente:
//: C10:CollectingParameterDemo.cpp #include <iostream> #include <string> #include <vector> using namespace std; class CollectingParameter : public vector<string> {}; class Filler { public: void f(CollectingParameter& cp) { cp.push_back("accumulating"); } void g(CollectingParameter& cp) { cp.push_back("items"); } void h(CollectingParameter& cp) { cp.push_back("as we go"); } }; int main() { Filler filler; CollectingParameter cp; filler.f(cp); filler.g(cp); filler.h(cp); vector<string>::iterator it = cp.begin(); while(it != cp.end()) cout << *it++ << " "; cout << endl; } ///:~
Listado 9.2. C10/CollectingParameterDemo.cpp
El parámetro de recolección debe tener alguna forma de establecer o insertar valores. Nótese que por esta definición, un Mensajero podría usarse como parámetro de recolección. La clave reside en que el parámetro de recolección se pasa y es modificado por la función que lo recibe.