To pozwala skojarzyć (lub „bind”) swój własne dane z funkcją, którą biblioteka ma wywoływać, bez konieczności posiadania przez bibliotekę informacji o danych.
Ponieważ patrzysz Boost.Asio, przyjrzeć się ich tutorial for binding arguments to a handler. Mają funkcji, które chcą używać jako przewodnika, który potrzebuje wskazówek do własnych danych, sam zegar i licznik:
void print(const boost::system::error_code& /*e*/,
boost::asio::deadline_timer* t, int* count)
{
// ...
}
async_wait
funkcja timera powoduje, funkcję użytkownika pod warunkiem, która ma zostać wywołana, gdy czas wygaśnięcia; ale zapewnia tylko pierwszy z tych argumentów.Handler ma postać
void handler(
const boost::system::error_code& error // Result of operation.
);
Więc możemy użyć bind
przekształcić naszą funkcję (chcąc trzy argumenty) na taki, który chce tylko jeden argument, poprzez określenie wartości mają być przekazywane jako dwóch pozostałych:
t.async_wait(boost::bind(print,
boost::asio::placeholders::error, &t, &count));
Wynik obiektu bind
jest obiektem funkcyjnym (tj. Obiektem klasy klasy, który przeciąży operator wywołania funkcji, operator()
), który w tym przypadku przyjmuje pojedynczy argument. Argument placeholders::error
mówi, że pierwszy argument jest nadal argumentem nowego typu funkcji; pozostałe dwa argumenty otrzymują wartości &t
i &count
po wywołaniu nowej funkcji. Więc gdybyśmy nazwać siebie:
auto f = boost::bind(print, boost::asio::placeholders::error, &t, &count)
f(some_error);
to będzie miało taki sam efekt jak wywołanie pierwotną funkcję z tych argumentów:
print(some_error, &t, &count);
Teraz, po upływie czasu, nasza funkcja jest wywoływana, z argumentami, które dostarczyliśmy, bez biblioteki Asio, która musi coś o nich wiedzieć.
Przekształca ona funkcję w inną, w której ustala się jeden lub więcej (lub zero) argumentów. Na przykład f (x, y) -> f (5, y). – Noel
Przepraszam, ale nie zrozumiałem dobrze. –
może pomóc: http://www.codeproject.com/Articles/13015/A-look-at-the-Boost-Bind-and-Function-libraries – midor