Anonymní profil Kureal – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Anonymní profil Kureal – Programujte.comAnonymní profil Kureal – Programujte.com

 

Příspěvky odeslané z IP adresy 85.71.92.–

Kureal
C / C++ › Adresa metody ze třídního uk…
10. 4. 2011   #140922

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!

Kureal
C / C++ › Adresa metody ze třídního uk…
10. 4. 2011   #140899

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é.

Kureal
C / C++ › Adresa metody ze třídního uk…
10. 4. 2011   #140895

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ě.

Kureal
C / C++ › Adresa metody ze třídního uk…
10. 4. 2011   #140891

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

 

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý