2017-11-21 4 views
-1

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?

+1

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

+0

@ 0x5453 ah, ok. eine Sekunde, ich werde es wieder ausführen – bordeo

+0

@ 0x5453 Fehler ist auf. Sieht so aus, als ob es nicht sicher ist, was der Innentyp im 'array2D > *' – bordeo

Antwort

3

How do I get a visually clean bind and cast?

Eine Möglichkeit ist:

using F = function<double(int,int,array2D<vector<double *>>*)>; 
auto step_func = 
    [temp](int i, int j, array2D<vector<double *>>* model){ 
     return ising_step_distribution(temp,i,j,model); 
    } 
} 

Und dann:

auto step_func_2 = F(step_func); 
mix_2D_model(step_func_2, ...); 

Oder:

mix_2D_model(F(step_func), ...); 
+0

genial - sieht optisch aus, wie ich es in der Hauptmethode mache. Haben Sie eine Sekunde, um zu erklären, was Sie hier tun?So oder so, dank - akzeptiert – bordeo

+0

@bordeo Es nutzt [ 'Funktionsguss expression'] (http://en.cppreference.com/w/cpp/language/explicit_cast) Notation. Im Grunde ruft der "F" -Konstruktor das Lambda hinein. –

+0

Okay, cool - ich werde das überprüfen. Danke, Mann. – bordeo

Verwandte Themen