2016-09-06 16 views
5

tôi có mã này:C++ Mã chức năng như là đối số

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

trong chính:

GpsLon.onUpdate(longitudeChanged); 

Tôi muốn làm điều gì đó như thế này:

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

(Giống như tôi làm trong kịch bản Java!); nhưng đây không phải là cách cứng nhắc. Làm thế nào để làm nó?

Tnx

Erik

+0

gì là chính xác là điểm điều này? Bạn không phải làm như thế này chút nào. – Annabelle

+2

@Link Làm thế nào nó phải được thực hiện? – wally

+0

Nhìn vào phản ứng của @ OMGTechy – Annabelle

Trả lời

8

Nầy, lambda hùng mạnh!

#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

Để giải mã này một chút, đây là một sự cố:

  • Bạn có một chức năng mà mất chức năng khác thông qua một mẫu đối số.
  • Chức năng đó không có gì khác ngoài việc gọi đối số của nó.
  • Bên trong chính, bạn gọi hàm đó với lambda làm đối số của nó.
  • Lambda có thể được chia thành ba phần [] (chụp, đừng lo lắng quá nhiều về điều đó bây giờ) () đối số chức năng, trong trường hợp này không có) và { ... } (phần thân, giống như bất kỳ hàm nào khác).

Vì vậy, các phần lambda chỉ này:

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

Dưới đây là một ví dụ về một lambda mà phải mất một int và lợi nhuận tăng gấp đôi giá trị của nó:

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

Có - đây là những gì tôi đang tìm kiếm. Cảm ơn bạn. –

Các vấn đề liên quan