2013-07-24 41 views
10

Tôi đang viết một hàm C + 11, có thể gọi là đối số và tôi muốn đặt đối số đó thành mặc định cho hàm không có chức năng. Đây là nỗ lực hết sức mình cho đến nay:C++ 11 lambdas làm đối số hàm mặc định

const std::function<void()> noop= [](){}; 
void f(int x, int y, std::function<void()> fn= noop) { /* ... */ } 

Tôi đang tự hỏi liệu các thư viện chuẩn cung cấp một "noop" chức năng std đối với tôi, hay tôi cần phải viết riêng của tôi như là tôi đã ở trên? Tôi cũng tự hỏi nếu có một cách để tránh đặt tên rõ ràng chức năng "noop". Ví dụ:

void f(int x, int y, std::function<void()> fn= [](){}) { /* ... */ } 

sẽ không biên dịch (trong Visual Studio 2012 Update 3), cũng không phải sẽ:

void f(int x, int y, std::function<void()> fn= std::function<void()>([](){})) { /* ... */ } 
+3

+1: Câu hỏi hay, nhưng còn về việc sửa lỗi nhỏ này thì sao? 'void f (int x, int y) {f (x, y, []() {}); } '(trong đó' void f (int, int, std :: function ) 'là hàm ban đầu của bạn không có tham số tùy chọn) – Zeta

+0

Hoạt động trong g ++ 4.7.2 BTW. –

+4

Bạn không nên đặt 'noop' ​​thành' std :: function', làm cho nó 'auto noop = [] {};'. Tôi nghi ngờ VS2012 là sai ở đây. Và noop kinh điển là '[] {}' - save '()'! Hoặc '<:]{%>' (cái nanh chú hề) để giải trí tối đa. – Yakk

Trả lời

3

Tôi đang tự hỏi liệu các thư viện chuẩn cung cấp một "noop" chức năng std cho tôi, hoặc tôi có cần phải viết của riêng mình như tôi đã nói ở trên không?

Không, không có hàm noop mặc định. Trong trường hợp này, bạn phải tạo riêng của bạn (như bạn đã làm với đối tượng functor noop).

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