Odebrání lambda funkce z pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Odebrání lambda funkce z pole – C / C++ – Fórum – Programujte.comOdebrání lambda funkce z pole – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
ingiraxo+15
Grafoman
8. 4. 2013   #1
-
0
-

čau, mám takovou pikantní otázku :)

Jde nějak odebrat z pole (třeba vektoru) lambda funkce?

jde o to, že bych kvůli událostem nebo smazání objektu chtěl tu položku (funkci) z pole taky odebrat, ale u lambdy vůbec netušim jak.. u funkcí to jde přes jejích adresu (nevim jestli to je úplně spolehlivý)

ps: je mi jasný, že můžu do pole cpát objekt co bude mít třeba název nebo id, ale řekněme, že mám jako prvky funkce

díky

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Reklama
Reklama
vitamin+8
Grafoman
8. 4. 2013   #2
-
0
-

#1 ingiraxo
Lamda funkcia je v podstate trieda s pretazenym operatorom (). Ak neprebera lamda ziadne atributy tak sa moze pretypovat na pointer na funkciu (vtedy je perator() staticka metoda).

Z lamdou mozes pracovat ako s akymkolvek inym objektom.

(lamda ma standartne aj kopy konstruktor a operator= ak tomu nebrania atributy lambdy)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
8. 4. 2013   #3
-
0
-

#2 vitamin
to je pěkný, ale netušim v čem mi to pomůže :)

lambda v poli vypadá takto (jako parametr má string)



0x001d1ec0 {Demo.exe!<lambda_547c33da2ea378748d1430c297953173>::<helper_func_cdecl>(std::basic_string<char,std::char_traits<char>,std::allocator<char> >)}

klasickou fci odstranim přes její adresu, ale z lambdy adresu nezískám.. nebo získám, ale musim si ji někam uložit pro pozdější odstranění z pole, což nechci zrovna

řekněme, že mám takovýto případ, kde chci z pole odstranit lambdu č.2 (index 1).. jak na to podle toho cos napsal?



typedef void (*FcePtr)(string);

FcePtr pole[10];
pole[0] = [](string str) { cout << str << 1; };
pole[1] = [](string str) { cout << str << 2; };

EDIT:

tim odstranim myslim přes funkci stylu 

// používám podobnou fci pro odebírání funkcí, ale právě jsem se zasekl u tech lambda
void removeFunction(FcePtr* pole, FcePtr function)
{
    // ...
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
8. 4. 2013   #4
-
0
-

#3 ingiraxo
To pole ma fixnu velkost, takze z neho nemozes nic odstranit, maximalne mozes prvky vynulovat:

pole[0] = nullptr;
pole[1] = nullptr;
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
8. 4. 2013   #5
-
0
-

#4 vitamin
jsem špatně napsal, přečti si edit u předchozího příspěvku

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
8. 4. 2013   #6
-
0
-

#5 ingiraxo
Lamda funkcie bez atributov mozes jednoducho pretypovat na pointer, cize vies adresu. V pripade lamdy s atributom je to trochu zlozitejsie:


	//lambdy bez atributov:
	void (*fnc1)(const std::string&) = [](const std::string& s)->void{};
	void (*fnc2)(const std::string&) = [](const std::string& s)->void{};

	if(fnc1 == fnc2);
	else;

	//s atributmi:
	int i;
	auto a1 = [&i](){return i+1;};
	auto a2 = [&i](){return i+2;};

	//
	if(reinterpret_cast<void*>(&decltype(a1)::operator()) == reinterpret_cast<void*>(&decltype(a2)::operator()));
	else;

        //pripdane mozes porovnavat adresy samotnych objektov, vtedy ale nesmies lambda objekt kopirovat
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
8. 4. 2013   #7
-
0
-

#6 vitamin
mám hotovýho něco podobnýho, ale to je právě s uchováním ptr pro pozdější odstranění, ale jak to koukám, tak bez něj to nejspíš nejde :( jinak to mám takto 

typedef void (*FcePtr)(string);

// main() --------------------------------------
auto lPtr = [](string str) { cout << str; };

FcePtr pole[10];
pole[0] = lPtr;
pole[1] = [](string str) { cout << str << 2; };

([](FcePtr* pole, FcePtr fce) {
    for (int i = 0; i < 10; ++i) {
        if (pole[i] == fce)
            pole[i] = nullptr;
    }
})(pole, lPtr);
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
vitamin+8
Grafoman
8. 4. 2013   #8
-
0
-

#7 ingiraxo
lambda funkcia nema ziadny globalny ani lokalny identifikator, takze si musis adresu ulozit do dkej premennej. Mozno by bolo lepsie pouzit obycajnu funkciu.

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
ingiraxo+15
Grafoman
8. 4. 2013   #9
-
0
-

bohužel no :( jen jsem nějak doufal, že třeba v c++11 existuje něco, co to dokáže zjistit bez uchování adresy na lambdu

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 93 hostů

Podobná vlákna

Lambda vyraz — založil Pavel

Funkce 2d pole nefunguje — založil TiTanerCZE

Funkce na velikost pole — založil Porcepoque

Moderátoři diskuze

 

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