2016-09-06 38 views
5

mam ten kod:kodu C++ w funkcji jako argumentu

void longitudeChanged() { 
    Serial.println("Longitude: " + String(GpsLon.value,8)); 
} 

w głównym:

GpsLon.onUpdate(longitudeChanged); 

chciałbym zrobić coś takiego:

GpsLon.onUpdate({ 
    Serial.println("Longitude: " + String(GpsLon.value,8)); 
}); 

(Jakbym wykonaj w języku Java!); , ale nie jest to tak surowy sposób. Jak to zrobić?

Tnx

Erik

+0

Co to dokładnie jest punktem to? W ogóle nie powinieneś tego robić. – Annabelle

+2

@Link Jak to ma być zrobione? – wally

+0

Spójrz na odpowiedź @ OMGTechy – Annabelle

Odpowiedz

8

Oto potężny lambda!

#include <iostream> 

template <typename T> 
void myFunction(T t) { 
    t(); 
} 

int main() { 
    myFunction([](){ std::cout << "Hi!" << std::endl; }); 
} 

If you'd like to learn more about them, take a look here

Aby odszyfrować to trochę, tu jest podział:

  • mieć funkcję, która przyjmuje inną funkcję za pomocą szablonu argumentu.
  • Ta funkcja nie robi nic innego, jak wywołanie jej argumentu.
  • Wewnątrz głównego wywołujemy tę funkcję z argumentem lambda.
  • Lambda może być podzielona na trzy części: [] (przechwytywanie, nie przejmuj się tym zbytnio) () argumenty funkcji, w tym przypadku ich nie ma) i { ... } (ciało, podobnie jak każda inna funkcja).

Więc część lambda jest właśnie to:

[](){ std::cout << "Hi!" << std::endl; } 

Oto kolejny przykład lambda, które odbywają int i zwraca podwoić swoją wartość:

[](int value){ return value * 2; } 
+0

Tak - tego właśnie szukałem. Dziękuję. –