Promotion: It is possible to use and implement Level Semantics and Rivalue reference emulation in the ASIO, in C ++ 11 My effort is short, but I do not know what I am doing.
Class definition:
Structure socket test: std :: enable_shared_from_this & lt; SocketTest & gt; {SocketTest (boost :: asio :: ip :: udp :: socket socket): socket_ (std :: move (socket)) {} template & lt; Typename handler & gt; Zero async_receive (dummy dummy, handler, and handler) {auto self (shared_from_this ()); Socket_.async_receive (boost :: asio :: buff_ (buf_), std :: bind ([this, self] (boost :: system :: error_code ec, std :: size_t bytes_transferred, handler and moved handler) {moved_handler (Ec, bytes_transferred);}, std :: move (handler)); } Std :: array & lt; Char, max_length & gt; Buf_; Boost :: asio :: ip :: udp :: socket socket_; };
Example of calling the class:
socket test socket_stest (std :: move (s)); Socket_test.async_receive (dummy ()), [] (boost :: system :: error_code ec, std :: size_t bytes_transferred) {// very good stuff done!});
It looks like handler copy works correctly in the below version, but I am interested in learning to avoid this copy:
struct SocketTest: std:: enable_shared_from_this & lt; SocketTest & gt; {SocketTest (boost :: asio :: ip :: udp :: socket socket): socket_ (std :: move (socket)) {} template & lt; Typename handler & gt; Zero async_receive (dummy dummy, handler handler) {auto_host_from_this ()); Socket_.async_receive (boost :: asio :: buff_ (buf_), [this, self, handler] (boost :: system :: error_code ec, std :: size_t bytes_transferred) {handler (ec, bytes_transferred);}); } Std :: array & lt; Char, max_length & gt; Buf_; Boost :: asio :: ip :: udp :: socket socket_; };
You call bind
Rivalue refers to the object to be executed, because when dam
saves its logic, it is no longer a rivalry. In your case you can accept it by handler
(And this is the last place where the handler is stored). You can look for more information.
In addition, you bound
:
socket_.async_receive (boost :: asio:: buffer (buf_), std :: bind ( [This, self] (boost :: system :: error_code ec, std :: size_t bytes_transferred, handler moved _handler // going through value ^^^^^^^) {moved_handler (Ec, bytes_transferred);} , Std :: placeholders :: _ 1, std :: placeholder :: _ 2, std :: move (handler)); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ / code>
No comments:
Post a Comment