Newsgroup: it.comp.lang.c++
Titolo: STL random_shuffle<....> e functor

Ho la seguente linea di codice:
        random_shuffle(vecTest.begin(), vecTest.end());
che mischia gli elementi di un vector(vecTest) dall'inizio alla fine.. 
(vecTest contiene 6 oggetti di tipo class  Domanda)
ogni volta che viene richiamata crea sempre la stessa sequenza, per ovviare 
ho utilizzato:
        random_shuffle(vecTest.begin(), vecTest.end(), randN);
nel main() istanzio un oggetto dalla classe RandomFunction:
        RandFunction randN;
qui sotto la dichiarazione e definizione della classe con l'overloading di 
().
Class RandomFunction{
    private:
        static bool seeded;
    public:
        inline RandomFunction();
        int operator() (int N){ cout << "*" << N << endl; return rand() % 
N;} // la cout non serve ma vorrei vedere da dove arriva quella N;
};
bool RandomFunction::seeded=false;
inline RandomFunction::RandomFunction(){
    cout << "Messaggio1" << endl;    // Per vedere quando viene richiamato 
il costruttore
    if (!seeded){
        cout << "Messaggio2" << endl; //Per vedere quando entra nell'if.
        srand(time(NULL));
        seeded=true;
    }
}
Il tutto funziona correttamente ma non riesco a capire cosa accada, mi 
spiego meglio:
Mandando in esecuzione il programma, (la prima riga del main è RandFunction 
randN;) mi appare:
--------------------
Messaggio1
Messaggio2
...
...
altro
...
...
*2
*3
*4
*5
*6
...
...
-----------------------------
ora cercando di ricostruire il tutto nella RandFunction randN; dichiaro 
l'oggetto, viene richiamato il costruttore e stampa quei 2 msg....OK
adesso però non riesco a capire dove prende i valori della N (che vengono 
incrementati ogni volta), o meglio mi sono accorto che aggiungengo un 
oggetto nel vector viene stampato anche il *7 a video
Conclusione:
sono gli oggetti inseriti nel vector - 1, il primo, ok :) ma come fanno a 
finire in quella N dentro l'overload dell'operatore ()....?!?
Grazie anticipatamente a chi potrà risolvermi questo "atroce" dubbio :)
anche dei link sull'argomento potranno essere utili, da quelli che ho 
trovato sono riuscito solo a capire che si chiamano functor e che sono 
qualcosa di simile a puntatori a funzioni.... ma nessuno con esempi e 
spiegazione dei meccanismi che stanno alla base...
Saluti
Rosario
 

 spiegazione dei meccanismi che stanno alla base...
http://www.sgi.com/tech/stl/functors.html
Summary
A Function Object, or Functor (the two terms are synonymous) is simply
any object that can be called as if it is a function. An ordinary
function is a function object, and so is a function pointer; more
generally, so is an object of a class that defines operator().
Quando fai
    void f (int a) {
	...
    }
da qui in poi il simbolo "f" rappresenta l'indirizzo di memoria
dell'inizio del tratto di codice che esegue f. Brevemente, l'indirizzo
della funzione.
Quando fai
    f(42);
cioe` che metti le parentesi dopo f, non fai altro che *chiamare* la
funzione in quel punto. Ma se usi "f" senza parentesi, allora stai
prendendo l'indirizzo della funzione.
Se fai
    struct F {
	void operator()(int a) { .... }
    };
e` un po come se avessi fatto la funzione di prima, solo che devi prima
istanziare la classe:
    F f;
e poi chiamare *esattamente* nello stesso modo della funzione.
    f(42);
Spero di non aver commesso errori. Ciao
-- 
int

 Ho la seguente linea di codice:
Potresti postare l'esempietto compilabile?
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg

 Potresti postare l'esempietto compilabile?
Diciamo che l'esempietto compilabile è abbastanza lungo :)  è un progetto 
per un esame all'università (qui la traccia 
http://www.grosso.it/modules.php?name=News&file=article&sid=4&mode=&order=0&thold=0
 )
in pratica per mischiare le domande e le risposte quando vengono 
visualizzate dall'utente, ho dovuto utilizzare l'argoritmo della stl 
random_shuffle sul vector dove sono conenute le domande/risposte, e li mi 
sono scontrato con i functor :)
Grazie per le risposte anche se qualche dubbio c'è ancora :) partirò da quel 
link appena posso
Saluti
Rosario