Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: sirTruhlik 05. 04. 2011, 14:56:28

Název: C++, ukazatel na statickou funkci
Přispěvatel: sirTruhlik 05. 04. 2011, 14:56:28
Ahoj lidi, už dva dny lovím na netu jak udělat ukazatel na satickou funkci v C++ ale jediný co sem našel, a už umim 100% nazpaměť, je jak udělat ukazatel na členskou funkci. Nemohl by mi tu někdo, prosím, poradit?  :)
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Sprostej anonym 05. 04. 2011, 15:04:32

typedef int (*p_fce_t)(int, int);

p_fce_t f;
f = MojeTrida::tvojeStatickaMetoda;


a tohle nefunguje?
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: sirTruhlik 05. 04. 2011, 15:14:00
Ty jo, teď podle toho mi to funguje. Ale zkoušel sem to všelijak, a takhle tušim taky; no nevim, každopádně dik, už mi to funguje. :)
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Sten 05. 04. 2011, 16:11:16
Pro C++ doporučuji Boost.Bind, tam se to potom dělá takto:
Kód: [Vybrat]
boost::function<int(int, int)> f = &MojeTrida::tvojeStatickaMetoda;
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Ondřej Novák 05. 04. 2011, 16:31:46
Pro C++ doporučuji Boost.Bind, tam se to potom dělá takto:
Kód: [Vybrat]
boost::function<int(int, int)> f = &MojeTrida::tvojeStatickaMetoda;

Aneb, jak zapsat ekvivalentní věc delším způsobem (a ještě nutné includovat boost). Ještě že C++ 2011 bude mít typ function
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Sten 05. 04. 2011, 17:10:51
Ještě že C++ 2011 bude mít typ function

std::function v C++ 2011 je převzatá právě z Boostu (stejně jako naprostá většina dalších novinek) a má totožný zápis.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Ondřej Novák 05. 04. 2011, 20:57:28
Ještě že C++ 2011 bude mít typ function

std::function v C++ 2011 je převzatá právě z Boostu (stejně jako naprostá většina dalších novinek) a má totožný zápis.

Tohle je jedna z věcí, které mě na celém konceptu vadí. Všechny nové typy narvali do namespace std, přestože jsou to konstrukce jazyka, nikoliv knihovny.

nevím, proč máme typ auto, ale std::function. Proč neudělají std::int? nebo std::auto? Jednou to je se std, podruhé ne. Visual studio například valnou část těchto typu narvalo do rootovského namespace, takže není nutné psát std::size_t ale jen size_t (generický typ pro operator new), není nutné psát std::type_info ale jen typeinfo. Další adept: std::initializer_list<int>, proč ho zase narvali do std? Ani for(:) se mi nelíbí, staví na begin() a end() což nepovažuji za šťasné.

Hrají si na normu, kde stl je její součástí a přitom, kdyby to oddělili, tak by to udělali lépe. Mýchají hrušky a jabka. No nic, jsem zase offtopic.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Logik 06. 04. 2011, 11:49:31
To narvání do namespace std má podle mě jedinej důvod: zachování zpětné kompatibility. Aby se to netlouklo s knihovnama, který už tydle typy mají pro něco jinýho.

Na druhou stranu, kdyby to teda v namespace std nějak rozuměn rozčlenili, aby člověk moh pomocí using se toho std:: balastu zbavit (podobně jako v pythonu import), tak by to bylo o dost lepší....
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: marwyn 06. 04. 2011, 13:21:52
Ještě že C++ 2011 bude mít typ function

std::function v C++ 2011 je převzatá právě z Boostu (stejně jako naprostá většina dalších novinek) a má totožný zápis.

Tohle je jedna z věcí, které mě na celém konceptu vadí. Všechny nové typy narvali do namespace std, přestože jsou to konstrukce jazyka, nikoliv knihovny.

nevím, proč máme typ auto, ale std::function. Proč neudělají std::int? nebo std::auto? Jednou to je se std, podruhé ne. Visual studio například valnou část těchto typu narvalo do rootovského namespace, takže není nutné psát std::size_t ale jen size_t (generický typ pro operator new), není nutné psát std::type_info ale jen typeinfo. Další adept: std::initializer_list<int>, proč ho zase narvali do std? Ani for(:) se mi nelíbí, staví na begin() a end() což nepovažuji za šťasné.

Hrají si na normu, kde stl je její součástí a přitom, kdyby to oddělili, tak by to udělali lépe. Mýchají hrušky a jabka. No nic, jsem zase offtopic.

Mýchají? Od slova dmýchat?

Jinak fakt děsnej problém napsat někde na začátku using namespace std; To člověku skoro ruka upadne  ;D
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Sten 06. 04. 2011, 14:04:59
nevím, proč máme typ auto, ale std::function. Proč neudělají std::int? nebo std::auto? Jednou to je se std, podruhé ne. Visual studio například valnou část těchto typu narvalo do rootovského namespace, takže není nutné psát std::size_t ale jen size_t (generický typ pro operator new), není nutné psát std::type_info ale jen typeinfo. Další adept: std::initializer_list<int>, proč ho zase narvali do std? Ani for(:) se mi nelíbí, staví na begin() a end() což nepovažuji za šťasné.
auto je konstrukce jazyka (klíčové slovo), std::function je třída v knihovně (STL je Standard Template Library). int a spol. je převzaté z C, tak to je mimo std. std::size_t je v std, protože je to typedef, ale protože takový typ je i v C, tak je i mimo std (pozor, teoreticky může jít o dva různé typy!). Stejně tak type_info a initializer_list jsou třídy a tak jsou v std. for(:) staví na begin a end, protože tak fungují iterátory v STL. Pokud se vám nehodí, tak ho používat nemusíte, původní for stále zůstal.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: nhx 06. 04. 2011, 23:06:45
for( : ) staví na begin a end, protože tak fungují iterátory v STL. Pokud se vám nehodí, tak ho používat nemusíte, původní for stále zůstal.

Tohle mi teda taky prijde z urciteho pohledu takove podivne, stavet konstrukt jazyka na zaklade (sice standardni) knihovny. I kdyz podobne pripady jsou v C++ zrejme uz od zacatku (operator new hazi std::bad_alloc)...
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Logik 07. 04. 2011, 01:06:02
A jak bys to chtěl udělat s tím forem jinak? Nějaký "magic methods" mít musíš. A když už nějaký mít musíš, tak proč ne zrovna ty, který používaj všechny standarní iterátory?

Teda, mohli to udělat přes interface, to je pravda, ale to by nebylo jiný, jen by to mělo standardní type-check...
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: nhx 07. 04. 2011, 09:17:55
A jak bys to chtěl udělat s tím forem jinak? Nějaký "magic methods" mít musíš. A když už nějaký mít musíš, tak proč ne zrovna ty, který používaj všechny standarní iterátory?

Teda, mohli to udělat přes interface, to je pravda, ale to by nebylo jiný, jen by to mělo standardní type-check...


Ja bych se na to vykaslal... std::for_each mi prijde dostacujici.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Logik 07. 04. 2011, 10:00:39
No tak přecijenom je to konstrukce trochu delší, musíš definovat anonymní funkci, takže nepřehlednější, atd... Že pro to udělali syntaktickej cukr, kterej se jinak nijak netluče je IMHO dobře. Pokud se Ti nelíbí, tak jeho nepoužíváním nic neztratíš...
Navíc pokud potřebuješ, by kroky cyklu na sobě závisely, tak navíc musíš použít proměnný definovaný vně anonymní fce, což dál snižuje přehlednost....
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: nhx 07. 04. 2011, 10:28:14
No tak přecijenom je to konstrukce trochu delší, musíš definovat anonymní funkci, takže nepřehlednější, atd... Že pro to udělali syntaktickej cukr, kterej se jinak nijak netluče je IMHO dobře. Pokud se Ti nelíbí, tak jeho nepoužíváním nic neztratíš...
Navíc pokud potřebuješ, by kroky cyklu na sobě závisely, tak navíc musíš použít proměnný definovaný vně anonymní fce, což dál snižuje přehlednost....

Ja vyhody chapu, jen mi to prijde takove nesystemove :-) Ono by se dalo neco podobnyho udelat makrem, ze jo...

Kód: [Vybrat]
#define foreach(it, cont) for((it) = (cont).begin(); (it) != (cont).end(); (it)++)

Samozrejme takhle nejde (nebo me alespon nenapada jak) deklarovat iterator primo ve foru, nebude to fungovat na klasicky pole atd... no nic, proste se s novou variantou foru smirim a bude to :-)
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Ondřej Novák 07. 04. 2011, 11:59:58
No tak přecijenom je to konstrukce trochu delší, musíš definovat anonymní funkci, takže nepřehlednější, atd...

ve foreach už můžeš rvát lambda funkci. Proto mi tohle přijde opradu zbytečné.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Sten 07. 04. 2011, 12:59:30
Ja vyhody chapu, jen mi to prijde takove nesystemove :-) Ono by se dalo neco podobnyho udelat makrem, ze jo...

Kód: [Vybrat]
#define foreach(it, cont) for((it) = (cont).begin(); (it) != (cont).end(); (it)++)

Samozrejme takhle nejde (nebo me alespon nenapada jak) deklarovat iterator primo ve foru, nebude to fungovat na klasicky pole atd... no nic, proste se s novou variantou foru smirim a bude to :-)

Doporučuji Boost.Foreach, dá se upravit a z něj také nový for vyšel :-)
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Logik 08. 04. 2011, 00:06:07
Ondra: lambda funkcí ale nevyřešíš for cyklus, kterej má závislý kroky. Respektive vyřešíš pomocí proměných z closure, ale to už nepřehledné je (ty stavové proměnné definuješ někde jinde, než je používáš).
Jinak myslím, že by to šlo udělat i makrem (definovat iterátor pomocí něco::iterator_type). Ale pokud se todle používá dnes a denně, tak považuji za přínos, když se pro to udělá jednotná norma a syntaktickej cukr, než aby to každej řešil plus mínus stejně, ale jinak.
Název: Re: C++, ukazatel na statickou funkci
Přispěvatel: Ondřej Novák 08. 04. 2011, 07:32:59
No ja to nevyuziju, protoze mam kontejnery navrzene trochu jinak, vic javovsky

Kód: [Vybrat]
for (auto i = pole.getFwIter();i.hasItems();) {
   auto x = i.getNext();
   ...
}

V Jave se to pouziva spis ve while cyklu. Podstatnou vyhodou tohodle stylu je, ze kiteraci mi staci jen jeden objekt (neni treba vytahovat dva nebo nekdy dokonce tri!). Iterator se chova jako stream a tak neni rozdil, zda ten kdo data cte je vytahuje z kontejneru, nebo jsou za behu generovany. Takove "pythonovske" generatory jsou v tom naprosto super.