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

时间:2011-10-13 16:10:46

标签: 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));

这非常好,但我不想在每次调用回调后重新创建绑定对象。相反,我想在我的类的构造函数中创建对象,并将其赋予async_receive。

问题是,我不知道如何将该对象声明为类成员。我所知道的只是汽车,它显然不会作为集体成员。

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的情况下声明绑定对象。

4 个答案:

答案 0 :(得分:11)

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

......或类似的东西。

答案 1 :(得分:0)

我猜你正在寻找boost function 只要签名正确,您就可以将绑定表达式的结果赋值给boost :: function对象。

答案 2 :(得分:0)

执行此操作的“标准”方法是将functor设为std::function

如果你真的想存储实际的binder对象,那么查看涉及binder的编译错误消息以找出确切的类型,并尝试使用它们来确定binder对象的实际类型。

答案 3 :(得分:0)

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;