Мне нужен отложенный вызов некоторой функции с аргументами. Иметь следующий тестовый код:
#include <functional>
#include <boost/bind.hpp>
#include <boost/function.hpp>
struct test
{
test()
{
std::cout << "ctor" << std::endl;
}
test& operator=(test const& t)
{
std::cout << "operator=" << std::endl;
return *this;
}
test(test const& t)
{
std::cout << "copy ctor" << std::endl;
}
~test()
{
std::cout << "dtor" << std::endl;
}
};
int foo(test const & t)
{
return 0;
}
int main()
{
test t;
boost::function<int()> f = boost::bind(foo, t);
f();
return 0;
}
Вывод:
ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
copy ctor
dtor
dtor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
Итак, мы можем увидеть, что копия ctor вызвала 11 раз !!!
Ok. Изменить boost :: bind to std :: bind:
int main()
{
test t;
boost::function<int()> f = std::bind(foo, t);
f();
return 0;
}
Вывод:
ctor
copy ctor
copy ctor
copy ctor
dtor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
copy ctor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
dtor
Копирование ctor вызывается 9 раз. Хорошо. Если изменить boost :: function на std :: function copy, ctor будет вызываться только 4 раза. Но это тоже плохое поведение.
Возможно ли это сделать за 1 вызов copy ctor? std :: ref - плохая идея, потому что он может вызываться в другом потоке и т. д.
Извините за мой плохой английский :) Спасибо.