bind Function
Umschließt Argumente an einen aufrufbaren Objekt.
template<class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
template<class Ret, class Fty, class T1, class T2, ..., class TN>
unspecified bind(Fty fn, T1 t1, T2 t2, ..., TN tN);
Parameter
Fty
Der Typ des Objekts in den Aufruf.TN
Der Typ des N-ten Aufrufsarguments.fn
Das Objekt zum Aufruf.tN
Das n-te Aufrufsargument.
Hinweise
Die Typen Fty, T1, T2, ..., TN müssen die konstruierbare Kopie sein, und INVOKE(fn, t1, ..., tN) muss ein gültiger Ausdruck für einige Werte w1, w2, ..., wN sein.
Die erste Vorlagenfunktion gibt einen Weiterleitungsaufrufswrapper g mit einem schwachen Ergebnistyp zurück.Der Zweck von g(u1, u2, ..., uM) ist INVOKE(f, v1, v2, ..., vN,result_of Class<Ftycv(V1, V2, ..., VN)>::type), wo cv die LebenslaufQualifizierer von g ist und die Werte und Typen der gebundenen Argumente v1, v2, ..., vN bestimmt werden, wie unten angegeben.Sie verwenden diesen, um Argumente an einen aufrufbaren Objekt zu binden, um ein aufrufbares Objekt mit einer angepassten Argumentliste auszuführen.
Die zweite Vorlagenfunktion gibt einen Weiterleitungsaufrufswrapper g mit einem geschachtelten Typ result_type zurück, der ein Synonym für Ret ist.Der Zweck von g(u1, u2, ..., uM) ist INVOKE(f, v1, v2, ..., vN, Ret), in dem cv die LebenslaufQualifizierer von g ist und die Werte und Typen der gebundenen Argumente v1, v2, ..., vN bestimmt werden, wie unten angegeben.Sie verwenden diesen, um Argumente an einen aufrufbaren Objekt zu binden, um ein aufrufbares Objekt mit einer angepassten Argumentliste und mit einem angegebenen Rückgabetyp auszuführen.
Die Werte der gebundenen Argumente v1, v2, ..., vN und den entsprechenden Typen V1, V2, ..., VN hängen vom Typ des entsprechenden Arguments ti des Typs Ti im Aufruf von bind und der LebenslaufQualifizierer cv des Aufrufswrappers g ab, wie folgt:
Wenn ti vom Typ reference_wrapper<T> ist, ist das Argument viti.get() und der Typ Vi ist T&;
Wenn der Wert eines std::is_bind_expression<Ti>::valuetrue ist, ist das Argument viti(u1, u2, ..., uM) und der Typ Vi ist result_of<Ticv(U1&, U2&, ..., UN&>::type;
Wenn der Wert j von std::is_placeholder<Ti>::value nicht null ist, ist das Argument viuj und der Typ Vi ist Uj&;
Andernfalls ist das Argument viti und der Typ Vi ist Ticv&.
Beispielsweise einer Funktion f(int, int) den Ausdruck angegeben bind(f, _1, 0) gibt einen Weiterleitungsaufrufswrapper cw so zurück, dass cw(x)f(x, 0) aufruft.Der Ausdruck bind(f, 0, _1) gibt einen Weiterleitungsaufrufswrapper cw so zurück, dass cw(x)f(0, x) aufruft.
Die Anzahl von Argumenten in einem Aufruf bind zusätzlich zum Argument fn muss gleich der Anzahl von Argumenten sein, die dem aufrufbaren Objekt fn übergeben werden können.Daher ist bind(cos, 1.0) korrekt, und sind bind(cos) und bind(cos, _1, 0.0) falsch.
Die Anzahl der Argumente im Funktionsaufruf zum Aufrufswrapper, der von bind zurückgegeben wird, muss wie der höchste nummerierte Wert von is_placeholder<PH>::value für alle Platzhalterargumente im Aufruf von bind mindestens so groß sein.Daher ist bind(cos, _2)(0.0, 1.0) (und gibt cos(1.0)) zurück, korrekt, und bind(cos, _2)(0.0) ist falsch.
Beispiel
// std_tr1__functional__bind.cpp
// compile with: /EHsc
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std::placeholders;
void square(double x)
{
std::cout << x << "^2 == " << x * x << std::endl;
}
void product(double x, double y)
{
std::cout << x << "*" << y << " == " << x * y << std::endl;
}
int main()
{
double arg[] = {1, 2, 3};
std::for_each(&arg[0], arg + 3, square);
std::cout << std::endl;
std::for_each(&arg[0], arg + 3, std::bind(product, _1, 2));
std::cout << std::endl;
std::for_each(&arg[0], arg + 3, std::bind(square, _1));
return (0);
}
Anforderungen
Header: <functional>
Namespace: std