2016-12-21 4 views
1

Diese Frage beinhaltet boost::asio ist aber eine reine C++ 11 Frage.Übergeben eines Lambda mit Rückgabewert in einen Rückruf ohne Rückgabewert

Ich bin neu in C++ 11 & lambda Techniken, die ich mit boost::asio::async_connect für die Netzwerkkommunikation zu nutzen versuchen.

Folgendes ist meine Funktion, die eine asynchrone Verbindung mit dem Host versucht.

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; 
} 

Alles funktioniert gut. Es gibt absolut keine funktionalen Probleme. Ich frage mich jedoch, ob boost::asio::async_connect einen ConnectionHandler without a return type in seinem letzten Parameter übernimmt, aber ich übergebe ein Lambda, d. H. my_connection_handler, die einen Wert zurückgibt.

Wie ist es möglich, dass ich ein Lambda mit einem Rückgabewert übergeben kann, während boost::asio::async_connect 's 4. Param einen Rückruf ohne einen Rückgabewert nimmt?

+1

der Rückgabewert kann verworfen werden, wie in diesem einfachen Beispiel: http://coliru.stacked-crooked.com/a/7d451892e201ba84 das gleiche geschieht in 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 Rückgabewerte werden verworfen !! Bedeutet das, dass ich einen Rückgabewert-basierten Rückruf an einen Callback mit ungültigem Rückgabewert binden kann? Oder ist das der Weg, wie asios connect_handler geschrieben wird? Wie gesagt, ich bin Neuling. Sorry, wenn es eine dumme Frage ist –

Antwort

2

boost::asio::async_connect ist eine Funktionsvorlage, die als viertes Argument ein Callable verwendet. Es verwendet nicht den Rückgabewert des besagten Callable, noch kümmert es sich darum. Genau wie du schreiben könntest:

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

Das Beispiel von @ m.s. ist auch gut. Da es sich um eine Vorlage handelt, löst die Funktion das Argument gemäß der template argument deduction rules.