[c++11] помогите разобраться с bind1st и bind2nd по ссылке
c++11 => use std::bind, Luke!
[c++11]
bind1st (deprecated)
bind2nd (deprecated)
[xoft c++]$ cat bind.cpp
#include <functional>
#include <iostream>
void test2(int & i1, int i2)
{
std::cout << i1 << " " << i2 << std::endl;
i1 = i2;
}
int main
{
int ii1 = 42;
int ii2 = 265;
auto f2 = std::ptr_fun(&test2);
auto f11 = bind1st(f2, ii1);
f11(ii2);
f11(ii2);
return 0;
}
[xoft c++]$ ./bind
42 265
265 265
[xoft c++]$ cat bind.cpp
#include <functional>
#include <iostream>
#include <string>
void test2(std::reference_wrapper<int> _x, std::reference_wrapper<int> _y)
{
int & x = _x.get;
int & y = _y.get;
std::cout << x << " " << y << std::endl;
x+=2;
y+=3;
}
int main
{
int x = 5, y = 10;
auto f2 = std::ptr_fun(&test2);
auto f11 = bind1st(f2, std::ref(x;
auto f12 = bind2nd(f2, std::ref(y;
f11(y);
f12(x);
f11(y);
return 0;
}
[xoft c++]$ ./bind
5 10
7 13
9 16
менять прототип функции не честно. так можно и просто амперсенд стереть.
Самое смешное, что забиндить ссылку как раз можноМожет, это из-за одиннадцатых? Там как-то смелее с ссылками стали, по моим наблюдениям.
В смысле? А если там по смыслу функции нужно аргументы изменять.
В том смысле что функция - это функция какого-нибудь API и портить её шаблонами по значению не хочется. А в биндинг засунуть хочется чтобы, допустим, сделать с её помощью шаблонное освобождение ресурса а-ля RAII.
Оставить комментарий
elenangel
хочу чтобы можно было сделать f11(ii1); но не получается связать с аргументом по ссылке.