2010-06-05 17 views
17

Mi rendo conto che questa è una domanda ridicola per qualcosa che richiede meno di 2 secondi da implementare. Ma ricordo vagamente di aver letto che uno è stato introdotto con il nuovo standard.Esiste un oggetto funzione "non fare nulla" in C++ (0x)?

Ho generato le intestazioni del VC10 e non ho trovato nulla. Puoi aiutare? Mi sta infastidendo! :)

edit: Il secondo pensiero, la nuova funtore stavo ricordando era probabilmente la estranei std::default_deleter.

+3

Che spreco di airmiles punti. Immagina i risparmi che avresti potuto fare se non si trattasse di una domanda della CW! – wilhelmtell

risposta

23

Si può sempre scrivere un no-op lambda: []{}

+0

mi piace questo, ma non funziona per il numero di 'std :: conditional' s ho sparsi. E una 'std :: function' vuota verrà lanciata su operator(). – dean

+1

'[] (...) {}' funzionerà per qualsiasi numero di argomenti di input. – Mikhail

0

Probabilmente stava pensando la funzione identità (std :: identità e apparentemente è stato rimosso nel progetto corrente) che non è la stessa cosa però.

+0

Avevo saputo di "identità" ma l'ho licenziato per essere un unario. Ricordo di aver avuto bisogno di un default_deleter generico per qualcosa, sei mesi fa ... non riesco a ricordare per cosa. – dean

1

Che ne dici di questo?

// 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 (...) 
    { 
    } 
}; 

Questo dovrebbe funzionare praticamente per qualsiasi utilizzo.

+0

Si noti che questo non riesce se mai tenta di passare un tipo non banalmente-copiabile come argomento per noop, perché non funzionano con ... – rerx

0

Io uso questo come no-op di rilascio per i casi in cui prevedo un funtore che non restituisce alcun valore.

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); } 
}; 

Ecco una variante C++ 11 per un numero arbitrario di parametri:

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...); 
    } 
}; 
Problemi correlati