2010-06-05 14 views
17

Zdaję sobie sprawę, że jest to absurdalne pytanie, które wymaga mniej niż 2 sekund. Ale niewyraźnie pamiętam, że przeczytałem, że został wprowadzony z nowym standardem.Czy obiekt funkcyjny "nie rób nic" nie istnieje w C++ (0x)?

Posłuchałem nagłówków VC10 i nie znalazłem nic. Możesz pomóc? To mnie dręczy! :)

edit: Na drugim myśli, nowa funktor byłem pamiętając była prawdopodobnie związana std::default_deleter.

+3

Co za strata punktów airmiles. Wyobraź sobie oszczędności, które mogłeś osiągnąć, gdyby nie było to pytanie CW! – wilhelmtell

Odpowiedz

23

Można zawsze napisać lambda no-op: []{}

+0

Podoba mi się to, ale nie działa z powodu liczby 'std :: conditional' s. Rozproszyłem się. I pusta 'std :: function' rzuci na operatora(). – dean

+1

'[] (...) {}' będzie działać dla dowolnej liczby argumentów wejściowych. – Mikhail

0

Państwo zapewne myśli o funkcji tożsamości (std :: tożsamości i widocznie to usunięte w obecnym projekcie), że nie jest to samo, choć.

+0

Znałem "tożsamość", ale odrzuciłem to jako jednoargumentowe. Pamiętam, że potrzebowałem czegoś standardowego za coś, sześć miesięcy temu ... nie pamiętam po co. – dean

1

Co powiesz na to?

// Return a noop function 
template <typename T> 
struct noop 
{ 
    T return_val; 

    noop (T retval = T()) 
     : return_val (retval) 
    { 
    } 

    T 
    operator (...) 
    { 
    return return_val; 
    } 
}; 

template <> 
struct noop<void> 
{ 
    void 
    operator (...) 
    { 
    } 
}; 

Powinno to działać praktycznie dla każdego użycia.

+0

Zauważ, że to nie powiedzie się, jeśli kiedykolwiek spróbujesz przekazać typ nietrywialny jako argument do odłożenia, ponieważ nie działają z ... – rerx

0

Używam tego jako drop-in no-op dla przypadków, w których oczekuję funktora, który nie zwraca żadnej wartości.

struct VoidNoOp { 
    void operator()() const { } 
    template<class A> 
    void operator()(A a) const { (void)(a); } 
    template<class A, class B> 
    void operator()(A a, B b) const { (void)(a); (void)(b); } 
    template<class A, class B, class C> 
    void operator()(A a, B b, C c) const { (void)(a); (void)(b); (void)(c); } 
}; 

Oto C++ 11 odmianą dla dowolnych liczb parametrów:

struct VoidNoOp { 
    void operator()() const { }; 
    template<typename P1, typename... Params> 
    void operator()(P1 p1, Params... parameters) { 
     (void)(p1);    // we do this just to remove warnings -- requires the recursion 
     operator()(parameters...); 
    } 
}; 
Powiązane problemy