2013-07-24 33 views
10

Piszę funkcję C + 11, która pobiera argument jako argument, i chciałbym, aby ten argument był domyślny dla funkcji no-op. To moja najlepsza próba tej pory:C++ 11 lambdas jako domyślne argumenty funkcji

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

Zastanawiam się, czy standardowe biblioteki zapewnić „noop” funkcję std dla mnie, czy muszę pisać moje własne, jak mam powyżej? Zastanawiam się również, czy istnieje sposób uniknięcia jawnego nazwania funkcji "noop". Na przykład:

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

nie skompilować (w Visual Studio 2012 Update 3), ani nie będzie:

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

+1: Dobre pytanie, ale co z tą małą poprawką? 'void f (int x, int y) {f (x, y, []() {}); } '(gdzie' void f (int, int, std :: function ) 'jest oryginalną funkcją bez opcjonalnego parametru) – Zeta

+0

Działa w g ++ 4.7.2 BTW. –

+4

Nie powinieneś tworzyć 'noop' ​​a' std :: function', make it 'auto noop = [] {};'. Podejrzewam, że VS2012 jest w błędzie. A kanoniczne noop to '[] {}' - save '()'! Lub '<:]{%>' (klaunowe noop) dla maksymalnej rozrywki. – Yakk

Odpowiedz

3

Zastanawiam się, czy standardowe biblioteki zapewnić "noop" funkcję std dla mnie, czy też muszę napisać własną tak jak powyżej?

Nie, nie ma domyślnych funkcji Noop. W tym przypadku musisz stworzyć swój własny (jak zrobiłeś z obiektem funcji Noop).

Powiązane problemy