如何存储一个boost :: bind对象作为类成员? [英] How can I store a boost::bind object as a class member?

查看:206
本文介绍了如何存储一个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 :: placeholder :: 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);
}

?函子//我如何声明这个?
...
};

注意:这可能是未成熟的优化,但我仍然想知道如何声明

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

...或类似的东西。


I'm writing an application that uses boost::asio. Asio's async_receive (or async_read) is invariably shown using a boost::bind object given for callback:

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));

That's perfectly nice, but I'd like not to have to recreate the bind object after each call to the callback. Instead, I'd like to create the object, say, in the constructor of my class, and give it to async_receive.

The problem is, I don't know how to declare that object as a class member. All I know is auto, and it obviously won't work as a class member.

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?
    ...
};

Note: This may very well be premature optimization, but I'd still like to know how to declare a bind object without auto.

解决方案

Use 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;
};

... or something like that.

这篇关于如何存储一个boost :: bind对象作为类成员?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆