.[ ČeskéHry.cz ].
C++ and function pointers

 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 2. říjen 2015, 11:28:38    Předmět: C++ and function pointers Odpovědět s citátem

Potřeboval jsem pointery na funkce, které by měly opožděné volání. Tzn. nastavit parametry předem a zavolat to někde jinde a navíc univerzálním voláním, abych mohl mít takto nabindovanou libovolnou funkci.

Postupně jsem s pomocí StackOverflow dokonvergoval k nějakému řešení (přes naprosté ale plus minus funkční šílenosti). Nakonec jsem udělal nějaký benchmark, zahrnující i některé ty šílenosti a popis výsledného řešení.

Kdo by se chtěl podívat, tak tady:

http://www.perry.cz/clanky/functions.html

Případné nápady a názory směřujte sem do diskuze.

Díky
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
TeaTime



Založen: 17. 06. 2011
Příspěvky: 264

PříspěvekZaslal: 4. říjen 2015, 20:06:42    Předmět: Odpovědět s citátem

Nějak to nechápu. Co to vlastně umí? Když říkáš, že se chceš nastavit parametry funkce a to pak zavolat později, tak bych normálně použil std::bind - čímž z jakékoliv funkce můžeš udělat std::function<void()>.

http://en.cppreference.com/w/cpp/utility/functional/bind napsal:
The function template bind generates a forwarding call wrapper for f. Calling this wrapper is equivalent to invoking f with some of its arguments bound to args.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
perry



Založen: 28. 07. 2009
Příspěvky: 879

PříspěvekZaslal: 4. říjen 2015, 21:35:23    Předmět: Odpovědět s citátem

Uložím si do proměnné typu IFunction ten "callback" a pak ho volám přes ten interface.

Něco jako:
kód:

class SceneManager
{
   std::vector<IFunction *> regFunctions;
}


class Something
{

void Update()
{
    SomeFunction * x = new SomeFunction();
    sceneManager->RegFunction(x);

    x->SetArgs(....)
}

}

//někde ve "scene manager" update metodě
foreach (IFunction t) t->Call()


tohle s obyčejným std::function a std::bind neudělám.

Navíc std::bind je jednorázový, nejsem schopný pak ty parametry změnit (pokud nepoužiju reference) a pořád jsem limitovaný návratovou hodnotou. Tady si ji uložím do interní proměnné toho mého "wrapper" a pak si ji někdě zase přečtu až po zavolání, když bude potřeba
_________________
Perry.cz
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> C / C++ Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna