2010-03-19 15 views
7

Recentemente ho iniziato a insegnare a me stesso la libreria di modelli standard. Ero curioso di sapere perché il metodo GetTotal() in questa classe restituisce 0?functor che restituisce 0

... 

class Count 
{ 
public: 
    Count() : total(0){} 
    void operator() (int val){ total += val;} 
    int GetTotal() { return total;} 
private: 
    int total; 
}; 

void main() 
{ 
    set<int> s; 
    Count c; 
    for(int i = 0; i < 10; i++) s.insert(i); 
    for_each(s.begin(), s.end(), c); 
    cout << c.GetTotal() << endl; 
} 

risposta

13

for_each calcia la funzione di by-value. Cioè, usa una copia del functor e non il functor stesso. Il tuo locale c è rimasto invariato.

for_each restituisce il funtore ha usato, però, così si poteva fare:

Count c; 
c = for_each(s.begin(), s.end(), c); 

O più idiomaticamente:

Count c = for_each(s.begin(), s.end(), Count()); 

Tuttavia, esiste tale funzionalità già (non è necessario per il vostro functor) :

int total = std::accumulate(s.begin(), s.end(), 0); 
+1

Questo è contro intuitivo. Sai perché l'hanno fatto in quel modo? –

+0

È perché c è nello stack e viene passato per valore a for_each, quindi viene passata una copia di c. Non ha nulla a che fare con for_each (altro poi ci vuole un functor invece di un puntatore a un functor), ma invece con la semantica del linguaggio. Per quanto riguarda il motivo per cui un functor e un puntatore a un functor potrebbero essere collegati ad esso, è anche in grado di prendere un puntatore a una funzione, così che indipendentemente da ciò che viene passato, for_each può chiamare f(). Ma quella parte è solo un'ipotesi –

+0

@Mark: non lo so davvero. Avrebbero potuto essere un riferimento e non dovrebbero esserci problemi. Non riesco a pensare a una situazione in cui essere un riferimento mi sorprenderebbe. Anch'io sono curioso. @Brandon: non sta chiedendo cosa significa la mia risposta. Intende "perché non l'hanno progettato per prendere la funzione per riferimento invece che per valore?" :) – GManNickG

Problemi correlati