2009-05-28 2 views
8

Nel nostro codice abbiamo un bel paio di casi di questo modello:Qual è il punto di questo modello: utilizzando una struct per contenere un singolo metodo

class outerClass 
{ 
    struct innerStruct 
    { 
     wstring operator()(wstring value) 
     { 
      //do something 
      return value; 
     } 
    }; 

    void doThing() 
    { 
     wstring initialValue; 
     wstring finalValue = innerStruct()(initialValue); 
    } 
}; 

Qual è il vantaggio di questo corso:

class outerClass 
{ 
    wstring changeString(wstring value) 
    { 
     //do something 
     return value; 
    } 

    void doThing() 
    { 
     wstring initialValue; 
     wstring finalValue = changeString(initialValue); 
    } 
}; 
+0

perché non chiedere la persona che ha scritto il codice? –

+0

perché non sono disponibili – Ant

+0

Oops. Deve imparare a copiare il codice più attentamente :) – Ant

risposta

4

È un passo di ottimizzazione per i predicati basati su modelli.

Non è questione di un functor essere più facile da usare rispetto a una funzione. Entrambi funzionano quasi allo stesso modo nei contesti boost e STL.

Come differiscono nella creazione di modelli.

Immaginate una funzione template banale che richiede un predicato

template< typename Predicate > 
void DoSomething(Predicate func) 
{ 
    func(); 
} 

Utilizzando una funzionesarà un'istanza di un'istanza di modello con un puntatore funzione di.

void changeString(); 

DoSomething(&changeString); 

// This creates a template instantiation expecting a pointer to a function. 
// The specific pointer may be evaluated at runtime. 

// void DoSomething(void(func*)()); 

Utilizzando un funtore sarà un'istanza di un'istanza di modello con un tipo specifico functor.

struct changeString 
{ 
    void operator()(); 
} 

DoSomething(changeString()); 

// This creates a template instantiation expecting an instance of the struct. 
// The exact function being called is now known at compile time. 

// void DoSomething(changeString); 

Con funtore, la funzionalità specifica è ora ben definite e struct vengono passati è probabilmente non utilizzato e può essere ottimizzata fuori.

+1

Molto chiaro, grazie. – Ant

16

Una struttura con un operatore() viene spesso chiamata un funtore, che agisce effettivamente come un "oggetto funzione". È possibile utilizzare questi funtori con molte API, in particolare l'STL, in modo più semplice e robusto rispetto a quanto è possibile utilizzare i tipici puntatori di funzione. Essendo oggetti funzionali, possono contenere lo stato e essere parametrizzati durante la costruzione per creare un gestore specializzato autonomo.

Presumo che spesso i tempi, si dispone di codice in outerClass che vuole utilizzare queste funzioni di libreria (vale a dire std :: for_each), e così hanno sviluppato questo modello per renderlo banale. Se non usi mai i funtori, allora sì, questa sintassi è inutile e difficile da leggere (e può essere sostituita come suggerisci tu).

Modifica: Potrebbe piacerti Question 317450, su operatore().

+0

Aha che ha senso grazie! Penso che in alcuni punti sia per questo motivo, ma in altri è semplicemente copiato (il modello, non il codice). – Ant