Ein Ersatz für std :: bind2nd

9

Ich habe ein foo was ein std::vector<int> ist. Es stellt die "Kanten" -Werte für eine Reihe von Bereichen dar.

Wenn beispielsweise foo {1, 3, 5, 7, 11} ist, sind die Bereiche 1-3, 3-5, 5-7, 7-11. Für mich bedeutet das 4 Perioden. Beachten Sie, dass jede Periode die erste Zahl in einem Bereich enthält und nicht die letzte. In meinem Beispiel erscheint 8 in der 3. (nullbasierten) Periode. 7 erscheint auch in der 3. Periode. 11 und oben erscheint nirgendwo. 2 erscheint in der 0. Periode.

Wenn bar ein int ist, verwende ich

%Vor%

um mir den Zeitraum anzugeben, der bar enthalten soll.

Mein Problem: std::bind2nd ist veraltet, daher sollte ich umgestalten. Was ist die äquivalente Aussage mit aktualisierten Funktionen? std::bind "fällt" nicht auf die naheliegende Art ein.

    
P45 Imminent 23.09.2015, 11:59
quelle

3 Antworten

9

In C ++ 11 können Sie std::bind ; es ist einfach nicht so offensichtlich, wie man es benutzt:

%Vor%

Der Schlüssel ist die Verwendung des Platzhalterarguments, das im Namespace std::placeholders deklariert ist. std::bind gibt ein Funktionsobjekt zurück, das beim Aufruf eine bestimmte Anzahl von Parametern akzeptiert. Die Platzhalter, die innerhalb des Aufrufs von std::bind verwendet werden, zeigen, wie die Argumente, die beim Aufrufen des resultierenden Objekts bereitgestellt werden, der Argumentliste der aufrufbaren Bindung zugeordnet werden, an die Sie binden. Also zum Beispiel:

%Vor%     
Jason R 23.09.2015, 12:04
quelle
8

Wie wäre es, direkt aus der Steinzeit ( bind2nd ) in die Eisenzeit mit einem C ++ 14 generischen Lambda zu gelangen und die Bronzezeit ( bind ) zu umgehen?

%Vor%

Und wenn die Eingabe sortiert ist

%Vor%

Lambdas lesen sich viel einfacher und sind auch einfacher zu inline als std::bind expresions. Siehe z.B. Lavevejs CppCon 2015 sprechen .

    
TemplateRex 23.09.2015 12:06
quelle
5

bind version wäre:

%Vor%

aber ich denke, es ist mehr ermutigt, lambdas zu verwenden, wie in:

%Vor%

Es wird auch empfohlen, überladene Funktionen begin/end anstelle von Methodenaufrufen zu verwenden. also wäre es wie:

%Vor%     
behzad.nouri 23.09.2015 12:04
quelle

Tags und Links