23 czerwca 2013

C++11 std::bind

Poprzednie wersje std::bind1st, std::bind2nd, z powodu swoich ograniczeń w nowym standardzie zostały uznane za przestarzałe i w przyszłości mogą być usunięte. Nowa wersja czerpie dużo z boost::bind. Poniżej ogólna postać tej funkcji:
auto nowFunkcja = std::bind(funkcja, argumenty);
std::bind dobrze współgra z lambdami, a czasami można je stosować zamiennie. Jeżeli chcemy przekazać jakiś parametr jako referencję trzeba posłużyć się funkcją std::ref. Przykład:
#include <iostream>
#include <vector>
#include <algorithm>

void in_range(std::ostream &os, int top, int bottom, int value) {
    if (value > bottom and value < top)
        os << "Value: " << value << std::endl;
}

int main()
{
    std::vector<int> vec {1, 3, 2, 6, 2};
    int const myBottom = 2;
    int const myTop = 9;

    using namespace std::placeholders;
    auto fun = std::bind(in_range, std::ref(std::cout), myTop, myBottom, _1);
    std::for_each(begin(vec), end(vec), fun);

    return 0;
}
std::for_each karmi naszą funkcję (fun) jednym argumentem przechwytywanym przez std::placeholders::_1. Wynik:
Value: 3
Value: 6

Brak komentarzy:

Prześlij komentarz