Prikaz jedne poruke
Stara 18.7.2014, 6:43   #9
Geomaster
V.I.P. Programiranje
 
Član od: 28.6.2007.
Lokacija: Beograd
Poruke: 2.342
Zahvalnice: 2.836
Zahvaljeno 1.047 puta na 507 poruka
Slanje poruke preko MSN-a korisniku Geomaster Slanje poruke preko Skypea korisniku Geomaster
Određen forumom Re: [C++] Unity sistem komponenti

Ne razumem ovo što si uradio. Možda je do toga što sam dočekao 7 sati budan, doduše, ali bi svejedno valjalo da mi razjasniš

Dodao si template parametar za tip klase kojoj pripada metod u Delegate klasu da bi mogao da držiš pointer-to-method, ali sada su ti delegati, koliko sam ja shvatio, neupotrebljivi za ono za šta sam ih ja koristio. Da bi ih koristio za bilo kakav publish-subscribe pattern, moraju svi delegati s istim argumentima da imaju isti tip. Moju EventSource klasu sada ne možeš da implementiraš, jer ne možeš da napraviš vektor delegata, jer su svi različitog tipa. Poenta mojih delegata i event sistema je da možeš da uradiš ovo:
Kod:
GameClass::nešto():

PhysicsObject *po = ...;
po->getCollisionEventSource()->addHandler(Delegate<void(parametri za event, nije ni bitno)>::fromMethod <GameClass, &GameClass::handleCollision>(this));
I baš zbog toga što tip klase ne može da bude template parametar, mora da se drži void* pokazivač ka objektu i da ga onda "method stub" kastuje. Poenta je da method stub bude jedini koji zna tip klase i metod ka kome se drži pokazivač, a da ga delegat poziva pomoću pokazivača ka funkciji, čiji tip ne zavisi od tipa klase.

Nadam se da si razumeo šta sam hteo da kažem. Dakle poenta je da delegati budu templatizirani samo po potpisu funkcije koju implementiraju, da bi mogli da se svi tretiraju isto i budu pozvani "na gomili" iz event sors klase, pomoću fire(). A da bi se to uradilo, mora postojati neki kôd koji zna tačan metod i klasu koju da pozove, a taj kôd mora da bude dostupan iz klase koja ne zna ništa o tome. Dakle zato koristimo ovaj method stub (originalno, kao što rekoh, Sergej Razanov predložio) i onda pozivamo njega. To je nažalost jedan dodatni poziv ka funkciji, ali možemo da se potrudimo da to rešimo tako što se nadamo da će kompajler biti dovoljno pametan da vidi da je stub samo poziv metode objekta i ništa drugo, i onda za methodStub<T, Method>() emituje direktan poziv metode te klase ili vtable lookup + poziv metode. A konstruktor kopije se poziva recimo u EventSource::addHandler (nem pojma da l' ima još negde, mrzi me da gledam sad).
Geomaster je offline   Odgovor sa citatom ove poruke
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci:
Belphegor (18.7.2014)