Attenzione che UniformDist() è il costruttore (più o meno parametrico), non un metodo. Io non faccio altro che istanziare la classe e passarne la copia a std::generate(). L'overload di operator() serve perché è richiesto dall'algoritmo usato da std::generate().fornisce il metodo UniformDist() grazie all'overload di ()
Ma pensavo: che senso ha creare una classe che ha come membro significativo una sola funzione di cui appunto poi devo fare l'overload () per richiamarla.
http://en.cppreference.com/w/cpp/algorithm/generate
Altri algoritmi hanno operator() diverso.
http://en.cppreference.com/w/cpp/algorithm
No. Lo scopo di un function object è di poter trattare un oggetto come una funzione.ho pensato che i function object abbiano tutt'altro scopo o no?
Nulla ti vieta di farlo, ma le variabili _a e _b devi passarle come parametri del template. Ricorda che la funzione non deve accettare parametri (nemmeno template) per essere usata con std::generate(). Se preferisci utilizzare un ciclo allora puoi utilizzare una funzione normale senza scomodare i template.Cioè in questo caso io farei direttamente una funzione template, perchè fare questo casino per un solo metodo?
In altre parole, gli algoritmi usati da STL richiedono determinate cose e se vuoi usarli devi implementare queste cose come vogliono loro. Ne più ne meno di qualsiasi altra funzione di libreria.
Esatto.Inoltre ti chiedo la seguente: non riesco bene ad inquadrare la differenza fra avere un functor e utilizzare un metodo di una classe. Il functor di fatto viene richiamato dopo che la classe viene istanziata giusto? Quindi diciamo che ho la class F e istanzio f, dopodichè da qualche parte utilizzerò f().
Se una funzione richiede C() quella gli devi dare. Chiariamoci: io ho usato operator() per rendere compatibile la classe UniformDist con l'algoritmo std::generate(), ma non c'è scritto da nessuna parte che debba essere l'unica soluzione: è solo una soluzione.Ma non è equivalente a avere class C che ha un metodo f e da qualche parte utlizzare C.f() ?
Guarda che operator() è una funzione membro come lo è C::f(), per cui ha accesso a tutte le variabili membro di C esattamente come C::f(). Non capisco cosa non ti sia chiaro.Credo di aver capito qualcosa riguardo al cambiare o meno stato alla classe, ma ho davvero difficoltà a capire cosa significhi