将Handler绑定到boost :: asio :: strand时的boost :: bind占位符问题

时间:2012-02-08 22:33:37

标签: c++ boost boost-asio boost-bind

void Connection::HandleRecvData(const boost::system::error_code & error)
{
    boost::asio::async_read( m_socket, boost::asio::buffer( m_recv_buffer ),
           m_io_strand.wrap( boost::bind( &Connection::HandleRecvData,
                                          shared_from_this(), _1, _2 ) ) ); //works
    boost::asio::async_read( m_socket, boost::asio::buffer( inbound_data_ ),
           m_io_strand.wrap( boost::bind( &Connection::HandleRecv, 
                                          shared_from_this(), _1, _2 ) ) ); //doesn't work
}

处理程序

void Connection::HandleRecv( const boost::system::error_code & error, int32_t actual_bytes )
{
    if( error || HasError() || m_hive->HasStopped() )
    {
        StartError( error );
    }
    else
    {
        m_recv_buffer.resize( actual_bytes );
        OnRecv( m_recv_buffer );
        m_pending_recvs.pop_front();
        if( !m_pending_recvs.empty() )
        {
            StartRecv( m_pending_recvs.front() );
        }
    }
}

不同的缓冲区类型:

std::vector< uint8_t > m_recv_buffer;  //and 
std::vector< char > m_recv_buffer;

我没有收到编译器错误,但在运行时,当收到数据的事件链被启动时,“&amp; Connection :: HandleRecv”永远不会被调用。我假设这是因为当评估占位符并且从不调用函数时函数签名是不正确的。

任何人都可以帮助解释占位符的评估方式。

我检查了绑定文档,我看到了:

bind(&X::f, ref(x), _1)(i);     // x.f(i)
bind(&X::f, &x, _1)(i);         //(&x)->f(i)
bind(&X::f, x, _1)(i);          // (internal copy of x).f(i)
bind(&X::f, p, _1)(i);          // (internal copy of p)->f(i)

但是当我打电话时没有“(i)”。

boost::bind( &Connection::HandleRecvData, shared_from_this(), _1, _2 )

PS这是我的第一篇文章,就我提供的详细程度以及下次描述我的问题时我可以更清楚的地方,任何提示都会有所帮助。先感谢您。

0 个答案:

没有答案