Как я могу сохранить объект boost:: bind как член класса?
Я пишу приложение, которое использует boost::asio
. Asio async_receive
(или async_read
) неизменно отображается с использованием объекта boost::bind
, заданного для обратного вызова:
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(),
chat_message::header_length),
boost::bind(&chat_session::handle_read_header,
shared_from_this(),
boost::asio::placeholders::error));
Это прекрасно, но мне не нужно будет воссоздавать объект привязки после каждого вызова обратного вызова. Вместо этого я хотел бы создать объект, скажем, в конструкторе моего класса и передать его async_receive.
Проблема в том, что я не знаю, как объявить этот объект как член класса. Все, что я знаю, это auto, и он явно не будет работать как член класса.
class Whatever
{
public:
Whatever()
{
functor = boost::bind(&Whatever::Callback);
}
private:
void Callback()
{
boost::asio::async_read(socket_,
boost::asio::buffer(read_msg_.data(),
chat_message::header_length),
functor);
}
?? functor; // How do I declare this?
...
};
Примечание. Это может быть очень преждевременной оптимизацией, но мне все равно хотелось бы знать, как объявить объект привязки без auto.
Ответы
Ответ 1
Используйте boost::function
:
class Whatever
{
public:
Whatever()
{
functor = boost::bind(
&chat_session::handle_read_header,
shared_from_this(),
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred
);
boost::asio::async_read(
socket_,
boost::asio::buffer(
read_msg_.data(),
chat_message::header_length
),
functor
);
}
private:
boost::function<void(const error_code, const size_t)> functor;
};
... или что-то в этом роде.
Ответ 2
Я думаю, вы ищете функцию повышения.
Вы можете присвоить результат выражения bind объекту boost:: function, если подпись правильная.
Ответ 3
"Стандартный" способ сделать это - сделать functor
be std::function
.
Если вы действительно хотите сохранить фактический объект связующего, посмотрите на сообщения об ошибках компиляции с использованием связующего, чтобы определить точный тип, и попробуйте использовать их для определения фактического типа объекта связующего.
Ответ 4
Возвращаемый тип boost:: bind - это boost:: function. Вот быстрый пример с использованием очень простой функции:
double f(int i, double d) {
cout << "int = " << i << endl;
return d;
}
boost::function<double (int)> bound_func = boost::bind(f, _1, 1.234);
int i = 99;
cout << bound_func(i) << endl;
В вашем случае функция имеет этот тип:
boost::function<void(const error_code, const size_t)> f;