Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка ПИ_ИКТ Программирование по С++ (1 семестр) _Хотов.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
5.83 Mб
Скачать

Использование ссылок

Одна из неприятностей заключается в том, что если связываемая функция принимает какой-то из своих аргументов по ссылке, то с использованием boost::bind его (напрямую) передать нельзя. Т. е. например, в следующем случае:

void foo(int& a, int& b);

int a = 1, b = 2;

boost::bind(foo, a, b);

аргументы a и b по ссылке переданы не будут. Для того, чтобы действительно передать ссылки, необходимо делать такой вызов:

boost::bind(foo, boost::ref(a), boost::ref(b));

В этом случае foo, вызываемый из связывателя, будет действительно работать со ссылками на соответствующие переменные.

Полную документацию и примеры использования можно найти в оригинальной документации: http://www.boost.org/libs/bind/bind.html

Пример использования.

#include <vector>

#include <boost/bind.hpp>

#include <boost/function.hpp>

class Test

{

public:

void f_1()

{

std::cout << "void f()" << std::endl;

}

void f_2(int i)

{

std::cout << "void f_2(): " << i << std::endl;

}

void f_3(const int &i)

{

std::cout << "void f_2(): " << i << std::endl;

}

void two_params(int a, int b)

{

std::cout << "void two_params(int a, int b): " << a << ", " << b << std::endl;

}

};

class Test2

{

public:

void do_stuff(const std::vector<int>& v)

{

std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, " "));

}

};

void test(const std::string &a)

{

std::cout << "void test(const std::string &a). a = " << a << std::endl;

}

void prn(boost::function<void(int)> fn, int a)

{

fn(a);

}

int _tmain(int argc, _TCHAR* argv[])

{

////////////////////// bind //////////////////////

std::cout << "boost::bind test" << std::endl;

Test a;

boost::bind(&Test::f_1, &a)();

boost::bind(&Test::f_2, &a, 1)();

int test_int(2);

boost::bind(&Test::f_2, &a, _1)(test_int);

boost::bind(&Test::f_3, &a, 3)();

int test_int_2(4);

boost::bind(&Test::f_3, &a, _1)(test_int_2);

int one(100), two(200);

boost::bind(&Test::two_params, &a, _1, _2)(one, two);

boost::bind(&Test::two_params, &a, _2, _1)(one, two);

std::string test_str("Hi there.");

boost::bind(&test, test_str)();

boost::bind(&test, _1)(test_str);

std::cout << std::endl;

////////////////////// function //////////////////////

std::cout << "boost::function test" << std::endl;

boost::function<void(void)> func;

func = boost::bind(&Test::f_1, &a);

func();

func = boost::bind(&Test::f_2, &a, 201);

func();

func = boost::bind(&Test::f_3, &a, 202);

func();

func = boost::bind(&Test::two_params, &a, 203, 204);

func();

boost::function<void(int)> func_2;

func_2 = boost::bind(&Test::f_2, &a, _1);

prn(func_2, 301);

func_2 = boost::bind(&Test::f_3, &a, _1);

prn(func_2, 302);

int i_303(303), i_304(304), i_305(305), i_306(306);

func_2 = boost::bind(&Test::two_params, &a, i_303, _1);

prn(func_2, 1);

func_2 = boost::bind(&Test::two_params, &a, _1, i_304);

prn(func_2, 1);

Test2 t;

std::vector<int> vec;

vec.resize(20);

std::generate_n(vec.begin(), 20, rand);

std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));

//simple_bind(&Test::do_stuff, t, _1)(vec);

//boost::bind(&Test2::do_stuff, t, _1)(vec);

return 0;

}