To je bezvadný!
Nevím proč jsem si před tím myslel, že to bude vracet různé hodnoty. Nicméně díky moc. Funguje to skvěle.
Dělal jsem něco na způsob událostí v C# a prakticky jsem to měl - až na tady tento problém. Fungovalo to vždy pro jednu metodu z 1 třídy, protože jsem sice třídu/instanci dokázal rozlišit přes její adresu, ale metodu v rámci třídy už ne.
Takže ještě jednou díky!
Příspěvky odeslané z IP adresy 85.71.92.–
Opravdu moc díky. Tolik řádků kvůli mě jsem nečekal :-).
Jen to moc neřeší můj problém. Potřebuji především, aby Method::Id(&MyClass::method1); vrátila vždy stejné číslo. Tedy něco v tomto smyslu:
cout << Method::Id(&MyClass::method1) << endl; //1
cout << Method::Id(&MyClass::method2) << endl; //2
cout << Method::Id(&MyClass2::method1) << endl; //3
cout << Method::Id(&MyClass::method1) << endl; //1
cout << Method::Id(&MyClass2::method1) << endl; //3
Vlastně budu mít třidu se 2-mi metodami:
template<class T> void Handler::RegisterMethod(T* Obj, void (T::* Func));
template<class T> void Handler::UnregisterMethod(T* Obj, void (T::* Func));
A potřebuju, aby když z různých míst budu registrovat různé metody různých tříd, aby to fungovalo nějak následovně:
[seznam]Když se zavolá RegisterMethod, zkontroluje se, jestli je metoda už vložená do std::map, pokud ne, vloží ji (nebude ji vkládat vícekrát).
Když se zavolá UnregisterMethod, mělo by se zkontrolovat, jestli v std::map je a případně ji odstraní.[/seznam]
Takže vlastně to nemusí být žádná věc na principu ID, ale porovnávat existenci metod v std::map podle adresy této metody mi přišlo OK. Ale nevím jestli to vůbec je možné.
Díky za odpověď.
Instanci k tomu třídnímu ukazateli mám - ve formě ukazatele. Ale vlastně mi nejde o to jak takovouto funkci zavolat, ale jak získat její adresu. Nebo ještě lépe - dostanu ukazatel na instanci třídy a třídní ukazatel a potřebuji získat nějaký jedinečný identifikátor této funkce. Tedy nějaké nejlépe číslo, které bude pro každou takto předanou metodu jedinečné a zároveň při dalších předáních stejné metody stejné. Takže mi nejde ani o tu typovou bezpečnost, potřebuji jen jakýsi "otisk".
Nevím jestli se mi to podařilo popsat dostatečně a srozumitelně.
Dobrý den,
je možné získat adresu metody ze třídního ukazatele? Tedy něco na tento způsob:
class A
{
public:
void Method();
}
unsigned long GetMethodAddress(A* ptrA, void (A::*ptrMethodInA)())
{
//return reinterpret_cast<unsigned long>(ptrA->*ptrMethodInA);
return ???;
}
A Obj;
cout << "Adresa metody: " << GetMethodAddress(&Obj, &Obj::Method) << endl;
Abych byl konkrétní. Potřebuju vygenerovat ID metod, kde se jejich ukazatel (shared_ptr) ukládá do kontejneru MAP. No a tyto metody pak potřebuji podle tohoto ID volat, odebírat z kontejneru a tak podobně. No a přišlo mi rozumné pro toto ID použít jejich adresu, když už mám ten ukazatel.
Díky moc za rady!
Kureal