9.3.2. Parámetro de Recolección

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.