Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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? :)
-
typedef int (*p_fce_t)(int, int);
p_fce_t f;
f = MojeTrida::tvojeStatickaMetoda;
a tohle nefunguje?
-
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. :)
-
Pro C++ doporučuji Boost.Bind, tam se to potom dělá takto:
boost::function<int(int, int)> f = &MojeTrida::tvojeStatickaMetoda;
-
Pro C++ doporučuji Boost.Bind, tam se to potom dělá takto:
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
-
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.
-
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.
-
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ší....
-
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
-
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.
-
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)...
-
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...
-
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.
-
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....
-
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...
#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 :-)
-
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é.
-
Ja vyhody chapu, jen mi to prijde takove nesystemove :-) Ono by se dalo neco podobnyho udelat makrem, ze jo...
#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 :-)
-
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.
-
No ja to nevyuziju, protoze mam kontejnery navrzene trochu jinak, vic javovsky
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.