2016-11-28 18 views
9

Tôi muốn sử dụng lambda làm tham số cho hàm C++, nhưng tôi không biết loại nào cần xác định trong khai báo hàm. Những gì tôi muốn làm điều này là:Sử dụng lambda làm tham số cho hàm C++

void myFunction(WhatToPutHere lambda){ 
    //some things 
} 

Tôi đã thử void myFunction(auto lambda)void myFunction(void lambda) nhưng không ai trong số các mã được biên dịch. Trong trường hợp nó quan trọng, lambda không trả lại bất cứ điều gì.

Làm cách nào để sử dụng lambda làm thông số trong hàm C++?

+3

Sử dụng một 'std :: function <> 'tham số. –

+0

bán dupe: http://stackoverflow.com/questions/28746744/passing-lambda-as-function-pointer. cố gắng tìm một cái tốt hơn. – NathanOliver

Trả lời

12

Bạn có 2 cách: thực hiện chức năng của bạn mẫu:

template <typename F> 
void myFunction(F&& lambda){ 
    //some things 
} 

hoặc xóa loại với std::function

void myFunction(const std::function<void()/* type of your lamdba::operator()*/>& f){ 
    //some things 
} 
+1

Lưu ý rằng trước đây tạo ra một bản sao mới của chức năng của bạn cho mỗi lambda khác nhau mà bạn vượt qua nó trong suốt chương trình của bạn, và không thể dễ dàng được sử dụng (có thể không phải ở tất cả) cho các chức năng mà bạn muốn xác định trong một đơn vị biên dịch riêng biệt . –

+2

Lưu ý rằng giải pháp thứ hai sẽ tạo ra khá nhiều chi phí thời gian chạy và sẽ phân bổ động. Vì giải pháp đầu tiên nhanh như khi bạn đặt nội dung trên lambda bên trong 'myFunction' –

7

Bạn có hai lựa chọn, về cơ bản.

Làm cho nó một khuôn mẫu:

template<typename T> 
void myFunction(T&& lambda){ 
} 

hoặc, nếu bạn không muốn (hoặc không thể) làm điều đó, bạn có thể sử dụng loại-xóa std::function:

void myFunction(std::function<void()> const& lambda){ 
} 

Ngược lại, nỗ lực của bạn với auto sẽ đúng theo các khái niệm TS như hiện được triển khai trong gcc, trong đó nó sẽ là abbreviated template.

// hypothetical C++2x code 
void myFunction(auto&& lambda){ 
} 

hoặc với một khái niệm:

// hypothetical C++2x code 
void myFunction(Callable&& lambda){ 
} 
0

Nếu đây là một chức năng inline, thích một mẫu, như trong

template<typename Func> 
void myFunction(Func const&lambda) 
{ 
    //some things 
} 

vì nó liên kết với bất cứ điều gì có ý nghĩa (và sẽ gây ra lỗi trình biên dịch cho bất kỳ thứ gì khác), bao gồm lambdas, các phiên bản của các lớp được đặt tên và các đối tượng std::function<>. Mặt khác, nếu chức năng này không phải là inline, tức là được thực hiện trong một số đơn vị biên dịch, bạn không thể sử dụng mẫu chung nhưng phải sử dụng một loại được chỉ định, tốt nhất là lấy đối tượng std::function<> và truyền qua tham chiếu.

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