2014-01-14 5 views
0

boost :: asio 인수를 바인딩하려고합니다.boost :: bind 정적 함수의 인수

template <typename T> 
struct bind_struct{ 

    typedef boost::system::error_code       error_code; 
    typedef boost::asio::ip::tcp::acceptor     tcp_acceptor_type; 
    typedef std::shared_ptr<boost::asio::ip::tcp::socket>  socket_type; 


    static void tcp_on_async_accept(error_code& er, 
            tcp_acceptor_type* acc, 
            socket_type socket){ 
     std::cout << "ok" << std::endl; 
    } 
    static void good_function(int m){ 
     std::cout << m << std::endl; 
    } 


}; 

바인딩 작업 : 문제가 여기에 무엇

/*Error*/ 
    bind_struct<void>::socket_type sock; 
    bind_struct<void>::tcp_acceptor_type* acc; 
    auto fn = boost::bind(bind_struct<void>::tcp_on_async_accept, 
               boost::asio::placeholders::error, 
               acc, sock); 
    fn(); 


    /*Ok*/ 
    auto fn1 = boost::bind(bind_struct<void>::good_function,_1); 
    fn1(10); 

바인딩 기능 구조의 정적 멤버입니까? Errors.

+0

'bind()'는 멤버 함수를 호출하지 않고 멤버 함수를 바인딩하려고하기 때문에 혼동 될 수 있습니다. '& sock'을 두번째 인자로'bind()'에 넘겨 주면 에러가 바뀌는가? – Chad

+0

링크로 @Chad smart_poiter 정상입니까? http://coliru.stacked-crooked.com/a/7615c6464bd2d488 – crastinus

답변

2

fn() functor는 전달 된 첫 번째 인수가 boost::system::error_code&에 바인딩 될 것으로 기대하기 때문에 실패합니다.

Boost.Asio 문서 boost::asio::placeholders::error 대한 상태 : 비동기 기능 중 어떤 핸들러의 에러 인자에 대응 boost::bind() 함께 사용

인자 자리,. 따라서

함수 :

void bind_struct::tcp_on_async_accept(
    boost::system::error_code&, 
    boost::asio::ip::tcp::acceptor*, 
    std::shared_ptr<boost::asio::ip::tcp::socket>) 

이 함께 바인딩된다

boost::asio::ip::tcp::acceptor* acceptor; 
std::shared_ptr<boost::asio::ip::tcp::socket> socket; 
auto fn = boost::bind(
    bind_struct<void>::tcp_on_async_accept, 
    boost::asio::placeholders::error, // _1 
    acceptor, socket); 

그 호출에 전달되는 첫 번째 인수 boost::system::error_code& 결합 할 때 fn에만 호출 될 수 얻어진 펑 . 따라서, 다음은 실패합니다

boost::system::error_code error; 
fn(error); 

bind()의 큰 그림 예를 들어 this 블로그를 읽고 생각해 다음이 작동으로

fn(); 

.


bind_struct::tcp_on_async_accept() 경우 그 값 또는 CONST 참조 error_code을 허용하도록 제 1 파라미터 유형을 변경 고려 async_accept() 동작 처리기로서 이용 될 것이다. Asynchronous Operations 유형 요구 사항은 핸들러의 첫 번째 매개 변수가 boost::system::error_code 유형의 lvalue이고 AcceptHandler 설명서에 h이 핸들러이고 ec이 const error_code 인 경우, h(ec)이 유효해야한다고 명시되어 있습니다. error_codeboost::system::error_code&에 바인딩 할 수 없으므로 bind_struct::tcp_on_async_accept()은 AcceptHandler 유형 요구 사항을 충족하지 못합니다.

+0

오류가 있습니다. 함수는 const boost :: asio :: error_code &를 수신해야합니다. 그러나 그것은 유용한 정보입니다. – crastinus

+1

@crastinus 'AcceptHandler'(http://www.boost.org/doc/libs/1_55_0/doc/html/boost_asio/reference/AcceptHandler.html) 문서에서 'h'가 핸들러이고 'ec'가 문서 인 경우 const'error_code'이면'h (ec)'표현식이 유효해야합니다. 따라서 함수는 값 또는 const 참조에 의해'error_code '를 받아 들일 수 있습니다.'bind()'를 사용할 때, 함수 인자를 구성 할 때 덧셈 인자가 함수에 바인드 될 수 있습니다. 바인딩에 'placeholders :: error' ('_1')이 0 또는 여러 번 나타날 수 있지만,'_2'와 같은 다른 위치에 대한 플레이스 홀더는 바인딩에 나타나지 않을 수 있습니다. –