Die Boost C++ Bibliotheken

Kapitel 42. Boost.Ref

Die Bibliothek Boost.Ref definiert zwei Funktionen boost::ref() und boost::cref() in der Headerdatei boost/ref.hpp. Sie sind von Bedeutung, wenn zum Beispiel eine Funktion mit std::bind() verknüpft werden soll, die als Parameter eine Referenz erwartet. Weil std::bind() Parameter kopiert, müssen Referenzen besonders gehandhabt werden.

Boost.Ref ist mit C++11 in die Standardbibliothek eingegangen. Sie finden dort die Funktionen std::ref() und std::cref() in der Headerdatei functional.

Beispiel 42.1. boost::ref() in Aktion
#include <boost/ref.hpp>
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

void print(std::ostream &os, int i)
{
  os << i << std::endl;
}

int main()
{
  std::vector<int> v{1, 3, 2};
  std::for_each(v.begin(), v.end(),
    std::bind(print, boost::ref(std::cout), std::placeholders::_1));
}

Im Beispiel 42.1 soll die Funktion print() als dritter Parameter an std::for_each() übergeben werden, um alle Zahlen in v auf einen Stream auszugeben. Weil print() zwei Parameter akzeptiert – einen Stream und eine Zahl, die auf den Stream ausgegeben werden soll – wird std::bind() verwendet. Über std::bind() wird als erster Parameter an print() der Stream std::cout übergeben. Da print() den Stream als Referenz erwartet, std::bind() Parameter jedoch als Kopie übernimmt, wird std::cout mit Hilfe der Funktion boost::ref() gekapselt. Diese Funktion gibt ein Proxy-Objekt zurück, das eine Referenz auf das Objekt enthält, das an boost::ref() übergeben wurde. Auf diese Weise ist es möglich, eine Referenz auf std::cout zu übergeben, obwohl std::bind() Parameter als Kopie übernimmt.

Mit der Template-Funktion boost::cref() kann eine konstante Referenz übergeben werden.