2013-05-28 5 views
9

Ich habe diesen Code geschrieben und kann derzeit einen ungültigen Callback akzeptieren und einen Wert an ihn übergeben. Kann ich den Benutzer jedoch in die Lage versetzen, mehrere Argumente zu setzen? Vielleicht etwas wie Callback Caller; anstelle von Callback ohne mehrere Typnamen zu definieren? Kann ich das alles irgendwie in einen Typnamen einfügen?Gibt es trotzdem kann ich eine Vorlage machen <typename T> mehrere Werte akzeptieren?

Zum Beispiel, hier ist meine Klasse

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); 
    } 

}; 

ich es wie folgt verwendet werden:

Callback<int> Test; 

Und es funktioniert gut, wenn ich nur ein Argument meiner Funktion übergeben werden soll. Ist es jedoch möglich, den Benutzer in die Lage zu versetzen, mehrere Werte zu definieren, ohne mehr als einen Typnamen zu haben?

I.e.

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

Etwas Ähnliches?

+1

Erwähnenswert, dass Sie 'emplace_back' anstelle von' push_back' in C++ 11 verwenden können, um es an Ort und Stelle zu erstellen. – chris

Antwort

13

In C++ 11, verwenden variadische Vorlagen:

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); 
    } 
}; 

Jetzt können Sie Ihre Klasse auf diese Weise instanziiert:

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

Danke, funktioniert perfekt. Ich werde über Verpackungsparameter lesen, um mehr zu erfahren. – Jason

+0

@Jason: OK, ich bin froh, dass ich helfen konnte. Wenn dies Ihre Frage beantwortet, denken Sie bitte daran, die Antwort als akzeptiert zu markieren, wenn das System es Ihnen erlaubt :) –

1

ohne C++ 0x Sie boost::mpl::set verwenden können, um einen Satz zu übergeben von Arten. Wenn Sie die Reihenfolge der Argumente benötigen, verwenden Sie boost::mpl::vector.

Weitere Informationen finden Sie unter http://www.boost.org.

Verwandte Themen