Ich habe mehrere Funktionen, die die folgende Art erhalten:C++: std :: bind -> std :: function
function<double(int,int,array2D<vector<double *>>*)>
Wo array2D
einen benutzerdefinierten Typ ist. Des Weiteren habe ich eine Funktion haben, die die folgenden als Argumente nimmt:
double ising_step_distribution(double temp,int i,int j,array2D<vector<double *>>* model)
Gerade jetzt, um den ersten Wert zu binden, temp
und geben einen Funktor, die die korrekte Signatur hat, ich schreibe:
double temp = some_value;
function<double(int,int,array2D<vector<double *>>*)> step_func =
[temp](int i, int j, array2D<vector<double *>>* model){
return ising_step_distribution(temp,i,j,model);
}
}
Und das funktioniert. Allerdings sind die folgenden Pausen:
auto step_func =
[temp](int i, int j, array2D<vector<double *>>* model){
return ising_step_distribution(temp,i,j,model);
}
}
mit dem folgenden Fehler:
candidate template ignored:
could not match
'function<double (int, int, array2D<vector<type-parameter-0-0 *, allocator<type-parameter-0-0 *> > > *)>'
against
'(lambda at /Users/cdonlan/home/mcmc/main.cpp:200:25)'
void mix_2D_model(function<double(int,int,array2D<vector<T*>>*)> step_distribution_func,...
Und so ist der Code Klumpen hässlich, obfuscative und repetitiven (weil ich viele davon machen).
Ich habe das Lesen der Dokumentation, und ich verstehe, dass ich in der Lage zu schreiben sollte:
function<double(int,int,array2D<vector<double *>>*)> step_func =
bind(ising_step_distribution,temp,_1,_2,_3);
jedoch die nur Beispiele, die ich gesehen habe, sind für Funktionen des Typs function<void()>
. Dieser schlägt mit einem Fehler fehl:
// cannot cast a bind of type
// double(&)(double,int,int,array2D<vector<double *>>*)
// as function<double(int,int,...)
Wie bekomme ich eine visuell saubere Bindung und Besetzung?
Welche Fehler haben Sie mit dem zweiten Lambda bekommen? Lambdas werden fast immer dem 'std :: bind' vorgezogen; Ich würde versuchen, wenn möglich mit der Lambda-Version zu arbeiten. – 0x5453
@ 0x5453 ah, ok. eine Sekunde, ich werde es wieder ausführen – bordeo
@ 0x5453 Fehler ist auf. Sieht so aus, als ob es nicht sicher ist, was der Innentyp im 'array2D> *' –
bordeo