2013-07-24 19 views
10

Bir argüman olarak callable olan bir C + 11 işlevi yazıyorum ve bu argümanın varsayılan bir op fonksiyonuna sahip olmasını istiyorum. Bu benim en iyi girişimi şimdiye kadar: Ben standart kütüphaneler benim için "noop" std fonksiyonunu sağlamak, ya da ben yukarıda sahip olarak kendi yazmak gerekiyor olmadığını merak ediyorumC++ 11 varsayılan işlev argümanları olarak 11 lambdas

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

? Ayrıca, "noop" işlevini açıkça belirtmekten kaçınmanın bir yolu olup olmadığını merak ediyorum. Örneğin:

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

(Visual Studio 2012 Güncelleme 3) derlemek, ne olacak olmaz: Ben standart kütüphaneleri bir "noop" std fonksiyonunu sağlamak olup olmadığını merak ediyorum

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

+1: Güzel soru, peki ya bu küçük tamir? void f (int x, int y) {f (x, y, []() {}); } '(burada' void f (int, int, std :: function ) 'isteğe bağlı parametre olmadan özgün işlevinizdir) – Zeta

+0

g ++ 4.7.2 BTW'de çalışır. –

+4

'noop' ​​a' std :: function' yapmamanız, 'auto noop' yapmamalısınız [] {}; '. VS2012'nin burada yanlış olduğundan şüpheleniyorum. Ve kanonik noop '' [] {} '-' '' '' '' '' '' 'dır! Veya maksimum eğlence için <:]{%> '(palyaço noop). – Yakk

cevap

3

Benim için ya da yukarıda sahip olduğum gibi kendi yazmam gerek mi?

Hayır, varsayılan noop işlevi yoktur. Bu durumda, kendinizinkini yaratmalısınız (noop functor nesnesi ile yaptığınız gibi).