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.