Visualizzazione dei risultati da 1 a 3 su 3
  1. #1

    wrapper per std::function [C++]

    Forse, il titolo non è molto azzeccato, ma non avevo proprio idea di come chiamare il thread XD.
    Ad ogni modo, io ho una classe così dichiarata:
    codice:
    template<class Type>
    class Event {
    typedef function<Type> FunctionObj;
    public:
         void Bind(const FunctioObj&) {...};
         void Fire({ARGOMENTI}) {
              vector<FunctionObj>::iterator it = Objs.begin();
              while(it != Objs.end())
              {
                      (*it)({ARGOMENTI});
                      ++it;
              }
         };
    protected:
         vector<FunctionObj> Objs;
    }
    Allora il mio problema è che vorrei che La lista degli argomenti di Fire, sia la stessa specificata per il prototipo di callback di function<>
    Es:
    codice:
    Event<void(int,char,size_t)> e;
    //dovrebbe darmi e.Fire(int, char, size_t), proprio come fa
    operator ()(...); di std::tr1::function.
    Ho notato che si fa uso di particolari costrutti, o boh tipo: _C_CLASS_ARG0, _ARG0_ARG1
    Spero possiate aiutarmi, è che non sia una domanda già fatta, giacchè con la ricerca non mi ha trovato nnt

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Quelle macro sono strettamente legate all'implementazione, quindi se aggiorni il compilatore non hai garanzie che rimangano.
    La cosa curiosa è che quello che chiedi esiste già nel C++0x (C++11?) con il nome di: packaged_task (che hanno un paio di funzionalià in più da non sottovalutare).
    Purtroppo VC++2010 non fornisce un'implementazione, quindi tocca arrangiarsi e in mancanza dei variadic_template previsti dal nuovo standard (ancora non supportati da VC++2010), l'unica cosa da fare è scriversi le varie specializzazioni (fino a 10 argomenti).
    Vari suggerimenti su come fare li puoi trovare qui:
    http://www.contezero.net/sites/conte...parte-seconda/

    Una volta capita la tecnica, il resto è un lavoro semplice ma noiso.

    C'è un'altra possibilità, comunque, che però si discosta da quello che chiedi ed è di rendere Fire una funzione void pura, effettuando il binding degli argomenti nel costruttore (o altra funzione) e memorizzare il binding nel vector. Lo svantaggio è che non puoi passare parametri a Fire, il vantaggio è che puoi memorizzare ogni tipo di funzione per poi invocarla come se fosse una funzione void().
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    grazie mille della risposta. Avevo già visto i variadic template, ma avevo dovuto rinunciarci, siccome uso VS2010... Vabbè me li scriverò a manina
    Grazie ancora

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.