c++ - 如何将 boost::bind 对象存储为类成员?

标签 c++ boost-asio 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));

这非常好,但我不想在每次调用回调后都重新创建绑定(bind)对象。相反,我想在类的构造函数中创建对象,并将其提供给 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?
    ...
};

注意:这很可能是过早的优化,但我仍然想知道如何在没有自动的情况下声明绑定(bind)对象。

最佳答案

使用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;
};

...或类似的东西。

关于c++ - 如何将 boost::bind 对象存储为类成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7757096/

相关文章:

c++ - 在另一个线程中运行 tcp 服务器

c++ - Boost::ASIO:如何从 io_service 获取返回值?

c++ - boost::bind 与空函数指针

c++ - 使用 boost::bind 重载运算符 boost undefined reference 错误

c++ - 希望定期执行一个函数,但继续执行其余的程序循环

c++ - 从 gdb python 宏访问 std::complex<>

c++ - stringstream 在无符号类型中失败 "streaming"负值?

c++ - C++ 中的除法

boost - boost::asio tcp 套接字关闭是否阻塞?

c++ - boost::bind、boost::function 和 boost::factory 的问题