2011-12-19 3 views
1

그것은 async_accept()에 대한 핸들러는 다음과 같은 함수 서명 만족해야 boost::asio document에 지정됩니다 부스트 :: 바인딩을 사용하여 Daytime.3 예에서, 그러나이 핸들러 요구

void accept_handler(
    const boost::system::error_code& ec) 
{ 
    ... 
} 

을,

class tcp_server 
{ 
public: 
    tcp_server(boost::asio::io_service& io_service) 
    : acceptor_(io_service, tcp::endpoint(tcp::v4(), 13)) 
    { 
    start_accept(); 
    } 

private: 
    void start_accept() 
    { 
    tcp_connection::pointer new_connection = 
     tcp_connection::create(acceptor_.get_io_service()); 

    acceptor_.async_accept(new_connection->socket(), 
     boost::bind(&tcp_server::handle_accept, this, new_connection, 
      boost::asio::placeholders::error)); 
    } 

    void handle_accept(tcp_connection::pointer new_connection, 
     const boost::system::error_code& error) 
    { 
    if (!error) 
    { 
     new_connection->start(); 
    } 

    start_accept(); 
    } 

    tcp::acceptor acceptor_; 
}; 

이유있다 : 핸들러는 (최대 9 개 인자이다) boost::bind의 한계를 초과하지 않는 한, 원하는대로 많은 파라미터로 지정 될 수 있는가? 나는 boost::bind으로 생각해도 정확한 함수 서명이 여전히 일치해야합니다.

handle_accept() 기능과이 기능이 async_accept()에서 어떻게 사용되는지 확인하십시오. 전체 코드는 here입니다.

답변

1

여기서 실제 답변을 찾았습니다. http://blog.think-async.com/2010/04/bind-illustrated.html 기본적으로 실제 함수는 ()이라는 함수 호출 연산자의 기본이라고합니다. boost :: bind는 함수 객체를 만들고, 다른 함수의 매개 변수가되는 데 필요한 함수 서명 인 것처럼 가장합니다. boost :: bind를 사용하면 추가 정보를 핸들러에 전달할 수 있습니다.

1

이 개념은 timer tutorial 3에 설명되어 있으며, 이는 bind의 작동 방식입니다. 이 예에서

, boost::bind()boost::asio::placeholders::error 인수 핸들러로 전달 된 오류 객체 명명 자리이다. 비동기 작업을 시작할 때 boost::bind()을 사용하는 경우 처리기의 매개 변수 목록과 일치하는 인수 만 지정해야합니다. 튜토리얼 Timer.4에서 콜백 핸들러가 매개 변수를 필요로하지 않으면이 자리 표시자가 생략 될 수 있습니다. async_accept와 질문에 대한 구체적인

error_code 매개 변수는 명명 된 매개 변수로 바인딩 함수 객체로 전달됩니다. 그러나 해당 매개 변수를 사용할 필요는 없습니다. 위의 단락이 나타내 듯이, 그것은 생략 될 수 있습니다. 추가 매개 변수도 제공 될 수 있으므로 처리기가 처리 한 비동기 작업에 대한 자세한 정보를 처리기에 제공 할 수 있습니다.

+0

이 가이드 : http://en.highscore.de/cpp/boost/index.html (기능 개체 부분)을주의 깊게 읽어서 알아 냈습니다. 답이 맞지만 충분하지는 않지만 답변 해 주셔서 감사합니다. 나는 왜'bind'가 두 개 이상의 매개 변수 함수를 더 적은 매개 변수로 필요한 함수 객체/포인터로 변환시킬 수 있는지 궁금해했다. – Amumu