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