2016-12-21 11 views
1

この質問にはboost::asioが含まれますが、純粋なC++ 11です。戻り値なしの戻り値を持つラムダを戻り値なしでコールバックに渡す

私は、ネットワーク通信にboost::asio::async_connectで使用しようとしていますC++ 11 & lambda技術に新しいです。

以下は、ホストとの非同期接続を試みる私の機能です。

bool MyAsyncConnectFunction() { 

    //some logic here to check validity of host 
    if (ip_is_not_resolved) 
    return false; 

    the_socket.reset(new tcp::socket(the_io_service)); 
    auto my_connection_handler = [this] 
     (const boost::system::error_code& errc, const tcp::resolver::iterator& itr) 
    { 
    if (errc) { 
     //Set some variables to false as we are not connected 
     return false; 
    } 

    //Do some stuff as we are successfully connected at this point 
    return true; 
    }; 

    //How is async_connect taking a lambda which 
    boost::asio::async_connect(the_socket, IP_destination, tcp::resolver::iterator(), my_connection_handler); 
    return true; 
} 

すべて正常です。機能的な問題は絶対にありません。しかし、私はboost::asio::async_connectが最後のパラメータでConnectionHandler without a return typeを取るのだろうと思っていますが、ラムダ、すなわちmy_connection_handlerを渡して値を返しています。

boost::asio::async_connectの4番目のparamが戻り値なしでコールバックを取るのに対し、私は戻り値でラムダを渡すことができますか?

+1

戻り値は、この単純な例のように廃棄することができる。http://coliru.stacked-crooked.com/a/7d451892e201ba84 同じASIOで行われる:https://github.com/boostorg/asio/ blob/42e7869f411a75512fb6994c634eb086fb9eb5cc/include/boost/asio/impl/connect.hpp#L258 –

+1

http://www.boost.org/doc/libs/1_62_0/doc/html/boost_asio/reference/asynchronous_operations.html#boost_asio.reference。 asynchronous_operations.return_type_of_an_initiating_function – Arunmu

+0

@ms戻り値は破棄されます!戻り値に基づくコールバックをvoid戻りコールバックにバインドできるということですか?それともasioのconnect_handlerが書かれているのでしょうか?私が言ったように私は初心者です。申し訳ありませんが、その愚かな質問 –

答えて

2

boost::asio::async_connectは、第4引数として呼び出し可能な関数テンプレートです。それは呼び出し可能な呼び出しの戻り値を使用せず、それを気にしません。次のように書くことができます:

auto f = []() { return true; }; 
f(); // Return value is discarded 

@ m.sの例です。良いです。それはテンプレートなので、関数はtemplate argument deduction rulesに従って引数を解決します。