2016-11-15 2 views
1
template<typename T, typename F> 
auto mapV(vector<T> v, F f) { 
    vector<T> ret = {}; 
    for(int i=0; i < v.size(); i++) { 
     ret[i] = f(v[i]); 
    } 
    return ret; 
} 

int main() { 
    vector<int> v = {1,2,3,4,5,6}; 
    vector<int> b = mapV(v, [](int &t){ return t*2; }); 
    for (int n : b) { 
     cout << "is " << n << endl; 
    } 
    return 0; 
} 

Dieser Code kompiliert, aber beim Ausführen generiert einen segfault. Was ist der richtige Weg, um eine Funktion generisch mit Templates zu akzeptieren? Ich möchte auch die Struktur der Funktion definieren, indem ich sagen kann, dass ich nur eine Funktion akzeptiere, die ein T nimmt und ein T zurückgibt, aber ich bin mir nicht sicher, wie ich das ausdrücken soll.Übergeben einer Funktion generisch an C++ - Vorlage

Ich habe versucht, mit std::function<T(T)> aber das hat nicht funktioniert entweder

+2

Sie schreiben über das Ende von 'ret' mit' ret [i] = ... '. – user2357112

+1

ah, muss ich stattdessen die Elemente schieben? – leshow

+0

Bitte keine vorhandenen Antworten ungültig machen, stattdessen eine andere Frage stellen. – Quentin

Antwort

1
vector<T> ret = {}; 

Dies erzeugt einen leeren Vektor.

for(int i=0; i < v.size(); i++) { 
    ret[i] = f(v[i]); 

Ordnet etwas zu den Werten in den Vektor ret. Im Vektor ret sind keine Werte vorhanden. Es gibt keine ret[0]. Es gibt keine ret[1] und so weiter. Dies ist ein nicht definiertes Verhalten. operator[] fügt dem Vektor keine neuen Werte hinzu, er modifiziert nur vorhandene.

Ersetzen Sie dies durch die push_back() Methode.

+0

Ok, das ist hilfreich, wissen Sie irgendetwas im Zusammenhang mit dem Titel der Frage? d. h. wie man ein Funktionsargument in einer Vorlage akzeptiert? Ich möchte die Funktion nur auf den Typ T -> T beschränken. Im Moment akzeptiere ich einfach alles. – leshow

+0

Sie können * den Parameter einer 'std :: function'-Variablen zuweisen. Alternativ können Sie die Vorlage mit dem entsprechenden Typ spezialisieren. –

+0

wie? überprüft der Compiler die Funktion ordnungsgemäß? – leshow

Verwandte Themen