[c++11] помогите разобраться с bind1st и bind2nd по ссылке

elenangel


#include <functional>
#include <iostream>

void test1(int param1)
{
std::cout << param1 << std::endl;
}

void test2(int &i1, int &i2)
{
std::cout << i1 << " " << i2 << std::endl;
}

int main(int ac, char** av)
{
int ii1 = 42;
int ii2 = 265;

auto f2 = std::ptr_fun(&test2);
// auto f11 = std::bind1st(f2, std::ref(ii1;
// auto f12 = std::bind2nd(f2, std::ref(ii2;

f2(ii1, ii2);
return 0;
}

хочу чтобы можно было сделать f11(ii1); но не получается связать с аргументом по ссылке.

Maurog

c++11 => use std::bind, Luke!

apl13

[c++11]
bind1st (deprecated)
bind2nd (deprecated)

rosali

Самое смешное, что забиндить ссылку как раз можно :) нельзя сгенерировать функцию от оставшейся ссылки. Вот так всё работает:

[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

rosali

Вот, нашел твоё спасение :)

[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

elenangel

менять прототип функции не честно. так можно и просто амперсенд стереть.

apl13

Самое смешное, что забиндить ссылку как раз можно
Может, это из-за одиннадцатых? Там как-то смелее с ссылками стали, по моим наблюдениям.

rosali

> можно и просто амперсенд стереть.
В смысле? А если там по смыслу функции нужно аргументы изменять.

elenangel

В том смысле что функция - это функция какого-нибудь API и портить её шаблонами по значению не хочется. А в биндинг засунуть хочется чтобы, допустим, сделать с её помощью шаблонное освобождение ресурса а-ля RAII.
Оставить комментарий
Имя или ник:
Комментарий: