2013-05-28 9 views
9

Ho scritto questo codice e attualmente è in grado di accettare un callback del void e passare un valore ad esso. Tuttavia, esiste un modo per rendere l'utente in grado di impostare più argomenti? Forse qualcosa come Callback Caller; invece di callback senza definire più nomi di battitura? Posso inserire tutto questo in un unico typename in qualche modo?Esiste comunque la possibilità che un modello <typename T> accetti più valori?

Per esempio, qui è la mia classe

template <typename T> 
class Callback 
{ 
private: 
    std::vector<std::function <void (T)>> func; 
public: 
    virtual void operator += (std::function<void (T)> _func) 
    { 
     func.push_back(_func); 
    } 

}; 

Io lo uso come questo:

Callback<int> Test; 

e funziona bene se voglio passare un solo argomento per la mia funzione. Tuttavia, è possibile rendere l'utente in grado di definire più valori, senza avere più di un nome tipografico?

I.e.

Callback< <(int, int, int)> > Test; 

Qualcosa di simile a quello?

+1

Vale la pena ricordare che è possibile utilizzare 'emplace_back' invece di' push_back' in C++ 11 per costruirlo in posizione. – chris

risposta

13

In C++ 11, utilizzare i modelli variadic:

template <typename... Ts> 
//    ^^^^^^ Parameter pack 
class Callback 
{ 
private: 
    std::vector<std::function <void (Ts...)>> func; 
//         ^^^^^ 
//         Parameter pack expansion 
public: 
    virtual void operator += (std::function<void (Ts...)> _func) 
//            ^^^^^ 
//        Parameter pack expansion    
    { 
     func.push_back(_func); 
    } 
}; 

Ora è possibile creare un'istanza la classe in questo modo:

Callback<int, int, int> 
Callback<double, std::string> 
Callback<bool> 
Callback<> 
... 
+0

Grazie, funziona perfettamente. Vado a leggere sui parametri di imballaggio per saperne di più. – Jason

+0

@Jason: OK, felice di poterti aiutare. Se questo risponde alla tua domanda, considera di contrassegnare la risposta come accettata quando il sistema ti consente :) –

1

senza C++ 0x è possibile utilizzare boost::mpl::set per passare un set di tipi. Se è necessario l'ordine degli argomenti, utilizzare boost::mpl::vector.

Vedere http://www.boost.org per ulteriori dettagli.

Problemi correlati