C++, ukazatel na statickou funkci

C++, ukazatel na statickou funkci
« kdy: 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?  :)


Sprostej anonym

Re: C++, ukazatel na statickou funkci
« Odpověď #1 kdy: 05. 04. 2011, 15:04:32 »

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

p_fce_t f;
f = MojeTrida::tvojeStatickaMetoda;


a tohle nefunguje?

Re: C++, ukazatel na statickou funkci
« Odpověď #2 kdy: 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. :)

Sten

Re: C++, ukazatel na statickou funkci
« Odpověď #3 kdy: 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;

Re: C++, ukazatel na statickou funkci
« Odpověď #4 kdy: 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


Sten

Re: C++, ukazatel na statickou funkci
« Odpověď #5 kdy: 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.

Re: C++, ukazatel na statickou funkci
« Odpověď #6 kdy: 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.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: C++, ukazatel na statickou funkci
« Odpověď #7 kdy: 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ší....

marwyn

Re: C++, ukazatel na statickou funkci
« Odpověď #8 kdy: 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

Sten

Re: C++, ukazatel na statickou funkci
« Odpověď #9 kdy: 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.

nhx

Re: C++, ukazatel na statickou funkci
« Odpověď #10 kdy: 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)...

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: C++, ukazatel na statickou funkci
« Odpověď #11 kdy: 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...

nhx

Re: C++, ukazatel na statickou funkci
« Odpověď #12 kdy: 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.

Logik

  • *****
  • 1 022
    • Zobrazit profil
    • E-mail
Re: C++, ukazatel na statickou funkci
« Odpověď #13 kdy: 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....

nhx

Re: C++, ukazatel na statickou funkci
« Odpověď #14 kdy: 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 :-)