<functional>
-Funktionen
Diese Funktionen sind in C++11 veraltet und in C++17 entfernt:
bind1st
bind2nd
mem_fun
mem_fun_ref
ptr_fun
Diese Funktionen sind in C++17 veraltet:
bind
Bindet Argumente an ein aufrufbares Objekt.
template <class FT, class T1, class T2, ..., class TN>
unspecified bind(FT fn, T1 t1, T2 t2, ..., TN tN);
template <class RTy, class FT, class T1, class T2, ..., class TN>
unspecified bind(FT fn, T1 t1, T2 t2, ..., TN tN);
Parameter
FT
Der Typ des aufzurufenden Objekts. Beispielsweise der Typ der Funktion, des Funktionsobjekts, des Funktionszeigers/des Bezugs oder des Memberfunktionszeigers.
RTy
Der Rückgabetyp. Wenn angegeben, ist es der Rückgabetyp des gebundenen Anrufs. Andernfalls ist der Rückgabetyp der Rückgabetyp .FT
TN
Der Typ des n-ten Aufrufarguments.
fn
Das aufzurufende Objekt.
tN
Das n-te Aufrufargument.
Hinweise
Die Typen FT, T1, T2, ..., TN
müssen kopierkonstruktierbar sein und INVOKE(fn, t1, ..., tN)
ein gültiger Ausdruck für einige Werte w1, w2, ..., wN
sein.
Die erste Vorlagenfunktion gibt einen weiterleitenden Aufrufwrapper g
mit einem schwachen Ergebnistyp zurück. Die Auswirkung g(u1, u2, ..., uM)
ist INVOKE(f, v1, v2, ..., vN,
invoke_result<FT cv (V1, V2, ..., VN)>::type)
, wobei cv
die CV-Qualifizierer und g
die Werte und Typen der gebundenen Argumente v1, v2, ..., vN
wie unten angegeben bestimmt werden. Damit binden Sie Argumente an aufrufbare Objekte, um aufrufbare Objekte mit einer angepassten Argumentliste zu erhalten.
Die zweite Vorlagenfunktion gibt einen weiterleitenden Aufrufwrapper g
mit einem geschachtelten Typ result_type
zurück, der ein Synonym für RTy
darstellt. g(u1, u2, ..., uM)
bewirkt INVOKE(f, v1, v2, ..., vN, RTy)
, wo cv
der CV-Qualifizierer von g
ist, und die Werte und Typen der gebundenen Argumente v1, v2, ..., vN
wie unten beschrieben bestimmt werden. Damit binden Sie Argumente an aufrufbare Objekte, um aufrufbare Objekte mit einer angepassten Argumentliste und einem angegebenen Rückgabetypen zu erhalten.
Die Werte des gebundenen Arguments v1, v2, ..., vN
und ihre entsprechenden Typen V1, V2, ..., VN
hängen folgendermaßen vom Typ Ti
des entsprechenden Arguments ti
im Aufruf an bind
und an die CV-Qualifiziererncv
des Aufrufwrappers g
ab:
Ist ti
der Typreference_wrapper<T>
, ist ti.get()
das Argument vi
und sein Typ Vi
lautet T&
;
Wenn der Wert des std::is_bind_expression<Ti>::value
Arguments ist und sein Typ Vi
lautet cv
result_of<Ti
(U1&, U2&, ..., UN&>::type
;ti(u1, u2, ..., uM)
vi
true
Wenn der Wert j
von std::is_placeholder<Ti>::value
nicht null ist, ist uj
das Argument vi
und sein Typ Vi
ist Uj&
;
Andernfalls ist das Argument vi
und sein Typ Vi
ist Ti
cv
&
.ti
Hat man beispielsweise eine Funktion f(int, int)
, gibt der Ausdruck bind(f, _1, 0)
einen weiterleitenden Aufrufwrapper cw
zurück, sodass cw(x)
f(x, 0)
aufruft. Der Ausdruck bind(f, 0, _1)
gibt einen weiterleitenden Aufrufwrapper cw
zurück, sodass cw(x)
f(0, x)
aufruft.
Die Anzahl der Argumente in einem Aufruf bind
und das Argument fn
muss der Anzahl der Argumente entsprechen, die an das aufrufbare Objekt fn
übergeben werden können. Ist z. B bind(cos, 1.0)
. richtig, und beides bind(cos)
und bind(cos, _1, 0.0)
sind falsch.
Die Anzahl von Argumenten in dem Funktionsaufruf an den Aufrufwrapper, der von bind
zurückgegeben wurde, muss mindestens so hoch sein wie der höchste nummerierte Wert von is_placeholder<PH>::value
für alle Platzhalterargumente in dem Aufruf an bind
. Ist z. B. bind(cos, _2)(0.0, 1.0)
richtig (und gibt cos(1.0)
zurück) und bind(cos, _2)(0.0)
ist falsch.
Beispiel
// std__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);
}
1^2 == 1
2^2 == 4
3^2 == 9
1*2 == 2
2*2 == 4
3*2 == 6
1^2 == 1
2^2 == 4
3^2 == 9
bind1st
Eine Hilfsvorlagenfunktion, die einen Adapter erstellt, um ein binäres Funktionsobjekt in ein unäres Funktionsobjekt zu konvertieren. Es bindet das erste Argument der binären Funktion an einen angegebenen Wert. Veraltet in C++11, entfernt in C++17.
template <class Operation, class Type>
binder1st <Operation> bind1st (const Operation& func, const Type& left);
Parameter
func
Das binäre Funktionsobjekt, das in ein unäres Funktionsobjekt konvertiert werden soll.
left
Der Wert, an den das erste Argument des binären Funktionsobjekts gebunden werden soll.
Rückgabewert
Das unäre Funktionsobjekt, das aus der Bindung des ersten Arguments des binären Funktionsobjekts an den Wert left
resultiert.
Hinweise
Funktionsbinder sind eine Art Funktionsadapter. Da sie Funktionsobjekte zurückgeben, können sie in bestimmten Arten der Funktionskomposition verwendet werden, um kompliziertere und leistungsfähigere Ausdrücke zu erstellen.
Wenn func
es sich um ein Objekt vom Typ Operation
handelt und c
eine Konstante ist, ist sie bind1st( func, c )
identisch mit dem binder1st
Klassenkonstruktor binder1st<Operation>(func, c)
und ist praktischer zu verwenden.
Beispiel
// functional_bind1st.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
// Creation of a user-defined function object
// that inherits from the unary_function base class
class greaterthan5: unary_function<int, bool>
{
public:
result_type operator()(argument_type i)
{
return (result_type)(i > 5);
}
};
int main()
{
vector<int> v1;
vector<int>::iterator Iter;
int i;
for (i = 0; i <= 5; i++)
{
v1.push_back(5 * i);
}
cout << "The vector v1 = ( " ;
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
// Count the number of integers > 10 in the vector
vector<int>::iterator::difference_type result1a;
result1a = count_if(v1.begin(), v1.end(), bind1st(less<int>(), 10));
cout << "The number of elements in v1 greater than 10 is: "
<< result1a << "." << endl;
// Compare: counting the number of integers > 5 in the vector
// with a user defined function object
vector<int>::iterator::difference_type result1b;
result1b = count_if(v1.begin(), v1.end(), greaterthan5());
cout << "The number of elements in v1 greater than 5 is: "
<< result1b << "." << endl;
// Count the number of integers < 10 in the vector
vector<int>::iterator::difference_type result2;
result2 = count_if(v1.begin(), v1.end(), bind2nd(less<int>(), 10));
cout << "The number of elements in v1 less than 10 is: "
<< result2 << "." << endl;
}
The vector v1 = ( 0 5 10 15 20 25 )
The number of elements in v1 greater than 10 is: 3.
The number of elements in v1 greater than 5 is: 4.
The number of elements in v1 less than 10 is: 2.
bind2nd
Eine Hilfsvorlagenfunktion, die einen Adapter erstellt, um ein binäres Funktionsobjekt in ein unäres Funktionsobjekt zu konvertieren. Es bindet das zweite Argument der binären Funktion an einen angegebenen Wert. Veraltet in C++11, entfernt in C++17.
template <class Operation, class Type>
binder2nd <Operation> bind2nd(const Operation& func, const Type& right);
Parameter
func
Das binäre Funktionsobjekt, das in ein unäres Funktionsobjekt konvertiert werden soll.
right
Der Wert, an den das zweite Argument des binären Funktionsobjekts gebunden werden soll.
Rückgabewert
Das Ergebnis des unären Funktionsobjekts, das das zweite Argument des binären Funktionsobjekts anbindet.right
Hinweise
Funktionsbinder sind eine Art Funktionsadapter. Da sie Funktionsobjekte zurückgeben, können sie in bestimmten Arten der Funktionskomposition verwendet werden, um kompliziertere und leistungsfähigere Ausdrücke zu erstellen.
Wenn func
es sich um ein Objekt vom Typ Operation
handelt und c
eine Konstante ist, ist sie bind2nd(func, c)
identisch mit dem binder2nd
Klassenkonstruktor binder2nd<Operation>(func, c)
und ist praktischer zu verwenden.
Beispiel
// functional_bind2nd.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
// Creation of a user-defined function object
// that inherits from the unary_function base class
class greaterthan15: unary_function<int, bool>
{
public:
result_type operator()(argument_type i)
{
return (result_type)(i > 15);
}
};
int main()
{
vector<int> v1;
vector<int>::iterator Iter;
int i;
for (i = 0; i <= 5; i++)
{
v1.push_back(5 * i);
}
cout << "The vector v1 = ( ";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
// Count the number of integers > 10 in the vector
vector<int>::iterator::difference_type result1a;
result1a = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 10));
cout << "The number of elements in v1 greater than 10 is: "
<< result1a << "." << endl;
// Compare counting the number of integers > 15 in the vector
// with a user-defined function object
vector<int>::iterator::difference_type result1b;
result1b = count_if(v1.begin(), v1.end(), greaterthan15());
cout << "The number of elements in v1 greater than 15 is: "
<< result1b << "." << endl;
// Count the number of integers < 10 in the vector
vector<int>::iterator::difference_type result2;
result2 = count_if(v1.begin(), v1.end(), bind1st(greater<int>(), 10));
cout << "The number of elements in v1 less than 10 is: "
<< result2 << "." << endl;
}
The vector v1 = ( 0 5 10 15 20 25 )
The number of elements in v1 greater than 10 is: 3.
The number of elements in v1 greater than 15 is: 2.
The number of elements in v1 less than 10 is: 2.
bit_and
Ein vordefiniertes Funktionsobjekt, das einen bitweisen AND-Vorgang (binär operator&
) für seine Argumente ausführt.
template <class Type = void>
struct bit_and : public binary_function<Type, Type, Type
{
Type operator()(
const Type& Left,
const Type& Right) const;
};
// specialized transparent functor for operator&
template <>
struct bit_and<void>
{
template <class T, class U>
auto operator()(T&& Left, U&& Right) const ->
decltype(std::forward<T>(Left) & std::forward<U>(Right));
};
Parameter
Type
, T
U
Jeder Typ, der ein operator&
-Element unterstützt, das Operanden angegebener oder abgeleiteter Typen akzeptiert.
Left
Der linke Operand des bitweisen AND-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs T
.
Right
Der rechte Operand des bitweisen AND-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs U
.
Rückgabewert
Das Ergebnis von Left & Right
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung des Ergebnisses mit dem von operator&
zurückgegebenen Typs.
Hinweise
Das bit_and
-Funktionselement wird auf Ganzzahltypen für die grundlegenden Datentypen oder benutzerdefinierte Typen beschränkt, die das binäre operator&
-Element implementieren.
bit_not
Ein vordefiniertes Funktionsobjekt, das einen bitweisen Komplementvorgang (NOT operator~
) für das Argument ausführt. In C++14 hinzugefügt.
template <class Type = void>
struct bit_not : public unary_function<Type, Type>
{
Type operator()(const Type& Right) const;
};
// specialized transparent functor for operator~
template <>
struct bit_not<void>
{
template <class Type>
auto operator()(Type&& Right) const -> decltype(~std::forward<Type>(Right));
};
Parameter
Type
Ein Typ, der ein unäres operator~
-Element unterstützt.
Right
Der Operand des bitweisen komplementären Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von eines lvalue- oder eines rvalue-Verweisarguments des abgeleiteten Typs Type
.
Rückgabewert
Das Ergebnis von ~ Right
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung des Ergebnisses mit dem von operator~
zurückgegebenen Typs.
Hinweise
Das bit_not
-Funktionselement wird auf Ganzzahltypen für die grundlegenden Datentypen oder benutzerdefinierte Typen beschränkt, die das binäre operator~
-Element implementieren.
bit_or
Ein vordefiniertes Funktionsobjekt, das einen bitweisen OR-Vorgang (operator|
) für seine Argumente ausführt.
template <class Type = void>
struct bit_or : public binary_function<Type, Type, Type>
{
Type operator()(
const Type& Left,
const Type& Right) const;
};
// specialized transparent functor for operator|
template <>
struct bit_or<void>
{
template <class T, class U>
auto operator()(T&& Left, U&& Right) const
-> decltype(std::forward<T>(Left) | std::forward<U>(Right));
};
Parameter
Type
, T
U
Jeder Typ, der ein operator|
-Element unterstützt, das Operanden angegebener oder abgeleiteter Typen akzeptiert.
Left
Der linke Operand des bitweisen OR-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs T
.
Right
Der rechte Operand des bitweisen OR-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs U
.
Rückgabewert
Das Ergebnis von Left | Right
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung des Ergebnisses mit dem von operator|
zurückgegebenen Typs.
Hinweise
Das bit_or
-Funktionselement wird auf Ganzzahltypen für die grundlegenden Datentypen oder benutzerdefinierte Typen beschränkt, die operator|
implementieren.
bit_xor
Ein vordefiniertes Funktionsobjekt, das einen bitweisen XOR-Vorgang (binär operator^
) für seine Argumente ausführt.
template <class Type = void>
struct bit_xor : public binary_function<Type, Type, Type>
{
Type operator()(
const Type& Left,
const Type& Right) const;
};
// specialized transparent functor for operator^
template <>
struct bit_xor<void>
{
template <class T, class U>
auto operator()(T&& Left, U&& Right) const
-> decltype(std::forward<T>(Left) ^ std::forward<U>(Right));
};
Parameter
Type
, T
U
Jeder Typ, der ein operator^
-Element unterstützt, das Operanden angegebener oder abgeleiteter Typen akzeptiert.
Left
Der linke Operand des bitweisen XOR-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs T
.
Right
Der rechte Operand des bitweisen XOR-Vorgangs. Die nicht spezialisierte Vorlage besitzt ein lvalue-Verweisargument vom Typ Type
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung von lvalue und rvalue-Verweisargumenten des abgeleiteten Typs U
.
Rückgabewert
Das Ergebnis von Left ^ Right
. Die spezialisierte Vorlage vervollkommnet die Weiterleitung des Ergebnisses mit dem von operator^
zurückgegebenen Typs.
Hinweise
Das bit_xor
-Funktionselement wird auf Ganzzahltypen für die grundlegenden Datentypen oder benutzerdefinierte Typen beschränkt, die das binäre operator^
-Element implementieren.
cref
Erstellt ein konstantes reference_wrapper
-Element aus einem Argument.
template <class Ty>
reference_wrapper<const Ty> cref(const Ty& arg);
template <class Ty>
reference_wrapper<const Ty> cref(const reference_wrapper<Ty>& arg);
Parameter
Ty
Der Typ des zu umschließenden Arguments.
arg
Das zu umschließende Argument.
Hinweise
Diese erste Funktion gibt reference_wrapper<const Ty>(arg.get())
zurück. Damit können Sie einen const-Verweis umschließen. Die zweite Funktion gibt reference_wrapper<const Ty>(arg)
zurück. Damit können Sie einen bereits umschlossenen Verweis erneut als const-Verweis umschließen.
Beispiel
// std__functional__cref.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val)
{
return (-val);
}
int main()
{
int i = 1;
std::cout << "i = " << i << std::endl;
std::cout << "cref(i) = " << std::cref(i) << std::endl;
std::cout << "cref(neg)(i) = "
<< std::cref(&neg)(i) << std::endl;
return (0);
}
i = 1
cref(i) = 1
cref(neg)(i) = -1
invoke
Ruft jedes aufrufbare Objekt mit den angegebenen Argumenten auf. In C++17 hinzugefügt.
template <class Callable, class... Args>
invoke_result_t<Callable, Args...>
invoke(Callable&& fn, Args&&... args) noexcept(/* specification */);
Parameter
Callable
Der Typ des aufzurufenden Objekts.
Args
Die Typen der Aufrufargumente.
fn
Das aufzurufende Objekt.
args
Den Aufrufargumente.
specification
Die noexcept
Spezifikation std::is_nothrow_invocable_v<Callable, Args>)
.
Hinweise
Ruft das aufrufbare Objekt fn
mithilfe der Parameter args
auf. Effektiv bedeutet INVOKE(std::forward<Callable>(fn), std::forward<Args>(args)...)
die Pseudofunktion INVOKE(f, t1, t2, ..., tN)
eines der folgenden Dinge:
(t1.*f)(t2, ..., tN)
, wennf
ein Zeiger auf eine Memberfunktion der KlasseT
undt1
ist, ist ein Objekt vom TypT
oder ein Verweis auf ein Objekt vom TypT
oder ein Verweis auf ein Objekt eines Typs, der vonT
abgeleitet wird. Das heißt, wennstd::is_base_of<T, std::decay_t<decltype(t1)>>::value
es wahr ist.(t1.get().*f)(t2, ..., tN)
wennf
ein Zeiger auf die Memberfunktion der KlasseT
ist undstd::decay_t<decltype(t1)>
eine Spezialisierung vonstd::reference_wrapper
.((*t1).*f)(t2, ..., tN)
istf
ein Zeiger auf die Memberfunktion der KlasseT
undt1
nicht einer der vorherigen Typen.t1.*f
, wenn N == 1 undf
ein Zeiger auf Memberdaten einer KlasseT
undt1
ist, ist ein Objekt vom TypT
oder ein Verweis auf ein Objekt vom TypT
oder ein Verweis auf ein Objekt eines Typs, der vonT
abgeleitet wird. Das heißt, wennstd::is_base_of<T, std::decay_t<decltype(t1)>>::value
es wahr ist.t1.get().*f
wenn N == 1 undf
ist ein Zeiger auf Memberdaten einer KlasseT
undstd::decay_t<decltype(t1)>
ist eine Spezialisierung vonstd::reference_wrapper
.(*t1).*f
wenn N == 1 ist undf
ein Zeiger auf Memberdaten einer KlasseT
ist undt1
keiner der vorherigen Typen ist.In allen anderen Fällen
f(t1, t2, ..., tN)
.
Informationen zum Ergebnistyp eines aufrufbaren Objekts finden Sie unter invoke_result. Prädikate für aufrufbare Typen finden Sie unter is_invocable, is_invocable_r, is_nothrow_invocable, is_nothrow_invocable_r Klassen.
Beispiel
// functional_invoke.cpp
// compile using: cl /EHsc /std:c++17 functional_invoke.cpp
#include <functional>
#include <iostream>
struct Demo
{
int n_;
Demo(int const n) : n_{n} {}
void operator()( int const i, int const j ) const
{
std::cout << "Demo operator( " << i << ", "
<< j << " ) is " << i * j << "\n";
}
void difference( int const i ) const
{
std::cout << "Demo.difference( " << i << " ) is "
<< n_ - i << "\n";
}
};
void divisible_by_3(int const i)
{
std::cout << i << ( i % 3 == 0 ? " is" : " isn't" )
<< " divisible by 3.\n";
}
int main()
{
Demo d{ 42 };
Demo * pd{ &d };
auto pmf = &Demo::difference;
auto pmd = &Demo::n_;
// Invoke a function object, like calling d( 3, -7 )
std::invoke( d, 3, -7 );
// Invoke a member function, like calling
// d.difference( 29 ) or (d.*pmf)( 29 )
std::invoke( &Demo::difference, d, 29 );
std::invoke( pmf, pd, 13 );
// Invoke a data member, like access to d.n_ or d.*pmd
std::cout << "d.n_: " << std::invoke( &Demo::n_, d ) << "\n";
std::cout << "pd->n_: " << std::invoke( pmd, pd ) << "\n";
// Invoke a stand-alone (free) function
std::invoke( divisible_by_3, 42 );
// Invoke a lambda
auto divisible_by_7 = []( int const i )
{
std::cout << i << ( i % 7 == 0 ? " is" : " isn't" )
<< " divisible by 7.\n";
};
std::invoke( divisible_by_7, 42 );
}
Demo operator( 3, -7 ) is -21
Demo.difference( 29 ) is 13
Demo.difference( 13 ) is 29
d.n_: 42
pd->n_: 42
42 is divisible by 3.
42 is divisible by 7.
mem_fn
Generiert einen einfachen Aufrufwrapper.
template <class RTy, class Ty>
unspecified mem_fn(RTy Ty::*pm);
Parameter
RTy
Der Rückgabetyp der umschlossenen Funktion.
Ty
Der Typ des Memberfunktionszeigers.
Hinweise
Die Vorlagenfunktion gibt einen einfachen Aufrufwrapper cw
mit einem schwachen Ergebnistyp zurück, sodass der Ausdruck cw(t, a2, ..., aN)
identisch INVOKE(pm, t, a2, ..., aN)
ist. Es löst keine Ausnahmen aus.
Der zurückgegebene Aufrufwrapper wird von std::unary_function<cv Ty*, RTy>
(und das Definieren des geschachtelten Typs result_type
als Synonym für RTy
und den geschachtelten Typ argument_type
als Synonym für cv Ty*
) nur abgeleitet, wenn der Typ Ty
ein Zeiger auf die Memberfunktion mit cv-Qualifizierer cv
ist, der keine Argumente akzeptiert.
Der zurückgegebene Aufrufwrapper wird abgeleitet von std::binary_function<cv Ty*, T2, RTy>
(und definiert den geschachtelten Typ result_type
als Synonym für RTy
, den geschachtelten Typ first argument_type
als Synonym für cv Ty*
) und den geschachtelten Typ als Synonym für T2
) nur, wenn der Typ Ty
second argument_type
ein Zeiger auf die Memberfunktion mit cv-Qualifizierer cv
ist, der ein Argument vom Typ T2
akzeptiert.
Beispiel
// std__functional__mem_fn.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
class Funs
{
public:
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()
{
Funs funs;
std::mem_fn(&Funs::square)(funs, 3.0);
std::mem_fn(&Funs::product)(funs, 3.0, 2.0);
return (0);
}
3^2 == 9
3*2 == 6
mem_fun
Hilfevorlagenfunktionen, die verwendet werden, um Funktionsobjektadapter für Memberfunktionen zu konstruieren, wenn Sie mit Zeigerargumenten initialisiert werden. Veraltet in C++11 für mem_fn
und bind
, und entfernt in C++17.
template <class Result, class Type>
mem_fun_t<Result, Type> mem_fun (Result(Type::* pMem)());
template <class Result, class Type, class Arg>
mem_fun1_t<Result, Type, Arg> mem_fun(Result (Type::* pMem)(Arg));
template <class Result, class Type>
const_mem_fun_t<Result, Type> mem_fun(Result (Type::* pMem)() const);
template <class Result, class Type, class Arg>
const_mem_fun1_t<Result, Type, Arg> mem_fun(Result (Type::* pMem)(Arg) const);
Parameter
pMem
Ein Zeiger auf die Memberfunktion der Klasse Type
, die in ein Funktionsobjekt konvertiert werden soll.
Rückgabewert
Ein const
oder ein Nicht-Const-Funktionsobjekt vom Typ mem_fun_t
oder mem_fun1_t
.
Beispiel
// functional_mem_fun.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
class StoreVals
{
int val;
public:
StoreVals() { val = 0; }
StoreVals(int j) { val = j; }
bool display() { cout << val << " "; return true; }
int squareval() { val *= val; return val; }
int lessconst(int k) {val -= k; return val; }
};
int main( )
{
vector<StoreVals *> v1;
StoreVals sv1(5);
v1.push_back(&sv1);
StoreVals sv2(10);
v1.push_back(&sv2);
StoreVals sv3(15);
v1.push_back(&sv3);
StoreVals sv4(20);
v1.push_back(&sv4);
StoreVals sv5(25);
v1.push_back(&sv5);
cout << "The original values stored are: " ;
for_each(v1.begin(), v1.end(), mem_fun<bool, StoreVals>(&StoreVals::display));
cout << endl;
// Use of mem_fun calling member function through a pointer
// square each value in the vector using squareval ()
for_each(v1.begin(), v1.end(), mem_fun<int, StoreVals>(&StoreVals::squareval));
cout << "The squared values are: " ;
for_each(v1.begin(), v1.end(), mem_fun<bool, StoreVals>(&StoreVals::display));
cout << endl;
// Use of mem_fun1 calling member function through a pointer
// subtract 5 from each value in the vector using lessconst ()
for_each(v1.begin(), v1.end(),
bind2nd (mem_fun1<int, StoreVals,int>(&StoreVals::lessconst), 5));
cout << "The squared values less 5 are: " ;
for_each(v1.begin(), v1.end(), mem_fun<bool, StoreVals>(&StoreVals::display));
cout << endl;
}
mem_fun_ref
Hilfevorlagenfunktionen, die verwendet werden, um Funktionsobjektadapter für Memberfunktionen zu konstruieren, indem Sie mit Verweisargumenten initialisiert werden. Veraltet in C++11, entfernt in C++17.
template <class Result, class Type>
mem_fun_ref_t<Result, Type> mem_fun_ref(Result (Type::* pMem)());
template <class Result, class Type, class Arg>
mem_fun1_ref_t<Result, Type, Arg> mem_fun_ref(Result (Type::* pMem)(Arg));
template <class Result, class Type>
const_mem_fun_ref_t<Result, Type> mem_fun_ref(Result Type::* pMem)() const);
template <class Result, class Type, class Arg>
const_mem_fun1_ref_t<Result, Type, Arg> mem_fun_ref(Result (T::* pMem)(Arg) const);
Parameter
pMem
Ein Zeiger auf die Memberfunktion der Klasse Type
, die in ein Funktionsobjekt konvertiert werden soll.
Rückgabewert
Ein const
- oder non_const
-Funktionsobjekt des Typs mem_fun_ref_t
oder mem_fun1_ref_t
.
Beispiel
// functional_mem_fun_ref.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
class NumVals
{
int val;
public:
NumVals ( ) { val = 0; }
NumVals ( int j ) { val = j; }
bool display ( ) { cout << val << " "; return true; }
bool isEven ( ) { return ( bool ) !( val %2 ); }
bool isPrime( )
{
if (val < 2) { return true; }
for (int i = 2; i <= val / i; ++i)
{
if (val % i == 0) { return false; }
}
return true;
}
};
int main( )
{
vector <NumVals> v1 ( 13 ), v2 ( 13 );
vector <NumVals>::iterator v1_Iter, v2_Iter;
int i, k;
for ( i = 0; i < 13; i++ ) v1 [ i ] = NumVals ( i+1 );
for ( k = 0; k < 13; k++ ) v2 [ k ] = NumVals ( k+1 );
cout << "The original values stored in v1 are: " ;
for_each( v1.begin( ), v1.end( ),
mem_fun_ref ( &NumVals::display ) );
cout << endl;
// Use of mem_fun_ref calling member function through a reference
// remove the primes in the vector using isPrime ( )
v1_Iter = remove_if ( v1.begin( ), v1.end( ),
mem_fun_ref ( &NumVals::isPrime ) );
cout << "With the primes removed, the remaining values in v1 are: " ;
for_each( v1.begin( ), v1_Iter,
mem_fun_ref ( &NumVals::display ) );
cout << endl;
cout << "The original values stored in v2 are: " ;
for_each( v2.begin( ), v2.end( ),
mem_fun_ref ( &NumVals::display ) );
cout << endl;
// Use of mem_fun_ref calling member function through a reference
// remove the even numbers in the vector v2 using isEven ( )
v2_Iter = remove_if ( v2.begin( ), v2.end( ),
mem_fun_ref ( &NumVals::isEven ) );
cout << "With the even numbers removed, the remaining values are: " ;
for_each( v2.begin( ), v2_Iter,
mem_fun_ref ( &NumVals::display ) );
cout << endl;
}
The original values stored in v1 are: 1 2 3 4 5 6 7 8 9 10 11 12 13
With the primes removed, the remaining values in v1 are: 4 6 8 9 10 12
The original values stored in v2 are: 1 2 3 4 5 6 7 8 9 10 11 12 13
With the even numbers removed, the remaining values are: 1 3 5 7 9 11 13
not1
Gibt das Komplement eines unären Prädikats zurück. Veraltet für not_fn
C++17.
template <class UnaryPredicate>
unary_negate<UnaryPredicate> not1(const UnaryPredicate& predicate);
Parameter
predicate
Das zu negierende unäre Prädikat.
Rückgabewert
Ein unäres Prädikat, das die Negation des modifizierten unären Prädikats ist.
Hinweise
Wenn ein Prädikat unary_negate
aus einem unären Prädikat predicate(x)
konstruiert wird, wird es zurückgegeben !predicate(x)
.
Beispiel
// functional_not1.cpp
// compile with: /EHsc
#include <vector>
#include <functional>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
vector<int> v1;
vector<int>::iterator Iter;
int i;
for (i = 0; i <= 7; i++)
{
v1.push_back(5 * i);
}
cout << "The vector v1 = ( ";
for (Iter = v1.begin(); Iter != v1.end(); Iter++)
cout << *Iter << " ";
cout << ")" << endl;
vector<int>::iterator::difference_type result1;
// Count the elements greater than 10
result1 = count_if(v1.begin(), v1.end(), bind2nd(greater<int>(), 10));
cout << "The number of elements in v1 greater than 10 is: "
<< result1 << "." << endl;
vector<int>::iterator::difference_type result2;
// Use the negator to count the elements less than or equal to 10
result2 = count_if(v1.begin(), v1.end(),
not1(bind2nd(greater<int>(), 10)));
cout << "The number of elements in v1 not greater than 10 is: "
<< result2 << "." << endl;
}
The vector v1 = ( 0 5 10 15 20 25 30 35 )
The number of elements in v1 greater than 10 is: 5.
The number of elements in v1 not greater than 10 is: 3.
not2
Gibt das Komplement eines binären Prädikats zurück. Veraltet für not_fn
C++17.
template <class BinaryPredicate>
binary_negate<BinaryPredicate> not2(const BinaryPredicate& func);
Parameter
func
Das zu negierende binäre Prädikat.
Rückgabewert
Ein binäres Prädikat, das die Negation des modifizierten binären Prädikats ist.
Hinweise
Wenn ein Prädikat binary_negate
aus einem binären Prädikat binary_predicate(x, y)
erstellt wird, wird es zurückgegeben !binary_predicate(x, y)
.
Beispiel
// functional_not2.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <cstdlib>
#include <iostream>
int main( )
{
using namespace std;
vector <int> v1;
vector <int>::iterator Iter1;
int i;
v1.push_back( 6262 );
v1.push_back( 6262 );
for ( i = 0 ; i < 5 ; i++ )
{
v1.push_back( rand( ) );
}
cout << "Original vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in ascending order,
// use default binary predicate less<int>( )
sort( v1.begin( ), v1.end( ) );
cout << "Sorted vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
// To sort in descending order,
// use the binary_negate helper function not2
sort( v1.begin( ), v1.end( ), not2(less<int>( ) ) );
cout << "Resorted vector v1 = ( " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; Iter1++ )
cout << *Iter1 << " ";
cout << ")" << endl;
}
Original vector v1 = ( 6262 6262 41 18467 6334 26500 19169 )
Sorted vector v1 = ( 41 6262 6262 6334 18467 19169 26500 )
Resorted vector v1 = ( 26500 19169 18467 6334 6262 6262 41 )
not_fn
Die not_fn
Funktionsvorlage verwendet ein aufrufbares Objekt und gibt ein aufrufbares Objekt zurück. Wenn das zurückgegebene aufrufbare Objekt später mit einigen Argumenten aufgerufen wird, übergibt es sie an das ursprüngliche aufrufbare Objekt und negiert das Ergebnis logisch. Es behält das Verhalten der Konstantenqualifizierung und wertkategorie des umschlossenen aufrufbaren Objekts bei. not_fn
ist neu in C++17 und ersetzt die veralteten std::not1
, , std::not2
, std::unary_negate
und std::binary_negate
.
template <class Callable>
/* unspecified */ not_fn(Callable&& func);
Parameter
func
Ein aufrufbares Objekt, das zum Erstellen des Umleitungsaufrufwrappers verwendet wird.
Hinweise
Die Vorlagenfunktion gibt einen Aufrufwrapper wie return call_wrapper(std::forward<Callable>(func))
, basierend auf dieser nur expositionsgeschützten Klasse, zurück:
class call_wrapper
{
using FD = decay_t<Callable>;
explicit call_wrapper(Callable&& func);
public:
call_wrapper(call_wrapper&&) = default;
call_wrapper(call_wrapper const&) = default;
template<class... Args>
auto operator()(Args&&...) & -> decltype(!declval<invoke_result_t<FD&(Args...)>>());
template<class... Args>
auto operator()(Args&&...) const& -> decltype(!declval<invoke_result_t<FD const&(Args...)>>());
template<class... Args>
auto operator()(Args&&...) && -> decltype(!declval<invoke_result_t<FD(Args...)>>());
template<class... Args>
auto operator()(Args&&...) const&& -> decltype(!declval<invoke_result_t<FD const(Args...)>>());
private:
FD fd;
};
Der explizite Konstruktor für das aufrufbare Objekt func
erfordert Typ std::decay_t<Callable>
, um die Anforderungen von MoveConstructible
, und is_constructible_v<FD, Callable>
muss wahr sein. Es initialisiert das umschlossene aufrufbare Objekt fd
aus std::forward<Callable>(func)
und löst jede Ausnahme aus, die fd
durch die Konstruktion ausgelöst wird.
Der Wrapper macht Anrufoperatoren verfügbar, die durch "lvalue" oder "rvalue reference category" und "const qualification" unterschieden werden, wie hier gezeigt:
template<class... Args> auto operator()(Args&&... args) & -> decltype(!declval<invoke_result_t<FD&(Args...)>>());
template<class... Args> auto operator()(Args&&... args) const& -> decltype(!declval<invoke_result_t<FD const&(Args...)>>());
template<class... Args> auto operator()(Args&&... args) && -> decltype(!declval<invoke_result_t<FD(Args...)>>());
template<class... Args> auto operator()(Args&&... args) const&& -> decltype(!declval<invoke_result_t<FD const(Args...)>>());
Die ersten beiden sind identisch mit return !std::invoke(fd, std::forward<Args>(args)...)
. Die zweiten beiden sind identisch mit return !std::invoke(std::move(fd), std::forward<Args>(args)...)
.
Beispiel
// functional_not_fn_.cpp
// compile with: /EHsc /std:c++17
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
int main()
{
std::vector<int> v1 = { 99, 6264, 41, 18467, 6334, 26500, 19169 };
auto divisible_by_3 = [](int i){ return i % 3 == 0; };
std::cout << "Vector v1 = ( " ;
for (const auto& item : v1)
{
std::cout << item << " ";
}
std::cout << ")" << std::endl;
// Count the number of vector elements divisible by 3.
int divisible =
std::count_if(v1.begin(), v1.end(), divisible_by_3);
std::cout << "Elements divisible by three: "
<< divisible << std::endl;
// Count the number of vector elements not divisible by 3.
int not_divisible =
std::count_if(v1.begin(), v1.end(), std::not_fn(divisible_by_3));
std::cout << "Elements not divisible by three: "
<< not_divisible << std::endl;
}
Vector v1 = ( 99 6264 41 18467 6334 26500 19169 )
Elements divisible by three: 2
Elements not divisible by three: 5
ptr_fun
Hilfevorlagenfunktionen, die verwendet werden, um die jeweiligen unären und binären Funktionszeiger in die unären und binären anwendbaren Funktionen zu konvertieren. Veraltet in C++11, entfernt in C++17.
template <class Arg, class Result>
pointer_to_unary_function<Arg, Result, Result (*)(Arg)> ptr_fun(Result (*pfunc)(Arg));
template <class Arg1, class Arg2, class Result>
pointer_to_binary_function<Arg1, Arg2, Result, Result (*)(Arg1, Arg2)> ptr_fun(Result (*pfunc)(Arg1, Arg2));
Parameter
pfunc
Der unäre oder binäre Funktionszeiger, der in eine anwendbare Funktion konvertiert werden soll.
Rückgabewert
Die erste Vorlagenfunktion gibt die unäre Funktion pointer_to_unary_function<Arg
, (* pfunc
) zurück. Result
>
Die zweite Vorlagenfunktion gibt binäre Funktion pointer_to_binary_functionArg1
<, Arg2
, (* Result
>) zurück. pfunc
Hinweise
Ein Funktionszeiger ist ein Funktionsobjekt. Es kann an jeden Algorithmus übergeben werden, der eine Funktion als Parameter erwartet, aber es ist nicht anpassbar. Informationen zu den geschachtelten Typen sind erforderlich, um ihn beispielsweise mit einem Adapter zu verwenden, um einen Wert an ihn zu binden oder ihn zu verwerfen. Durch die Konvertierung von unären und binären Funktionszeigern mithilfe der Hilfsfunktion ptr_fun
können die Funktionsadapter mit unären und binären Funktionszeigern arbeiten.
Beispiel
// functional_ptr_fun.cpp
// compile with: /EHsc
#include <vector>
#include <algorithm>
#include <functional>
#include <cstring>
#include <iostream>
int main( )
{
using namespace std;
vector <char*> v1;
vector <char*>::iterator Iter1, RIter;
v1.push_back ( "Open" );
v1.push_back ( "up" );
v1.push_back ( "the" );
v1.push_back ( "opalescent" );
v1.push_back ( "gates" );
cout << "Original sequence contains: " ;
for ( Iter1 = v1.begin( ) ; Iter1 != v1.end( ) ; ++Iter1 )
cout << *Iter1 << " ";
cout << endl;
// To search the sequence for "opalescent"
// use a pointer_to_function conversion
RIter = find_if( v1.begin( ), v1.end( ),
not1 ( bind2nd (ptr_fun ( strcmp ), "opalescent" ) ) );
if ( RIter != v1.end( ) )
{
cout << "Found a match: "
<< *RIter << endl;
}
}
ref
Konstruiert ein reference_wrapper
aus einem Argument.
template <class Ty>
reference_wrapper<Ty> ref(Ty& arg);
template <class Ty>
reference_wrapper<Ty> ref(reference_wrapper<Ty>& arg);
Rückgabewert
Ein Verweis auf ein arg
; insbesondere reference_wrapper<Ty>(arg)
.
Beispiel
Im folgenden Beispiel werden zwei Funktionen definiert: eine, die an eine Zeichenfolgenvariable gebunden ist, die andere, die an einen Verweis der Zeichenfolgenvariablen gebunden ist, der durch einen Aufruf von ref
berechnet wurde. Wenn sich der Wert der Variablen ändert, verwendet die erste Funktion weiterhin den alten Wert, und die zweite Version verwendet den neuen Wert.
#include <algorithm>
#include <functional>
#include <iostream>
#include <iterator>
#include <ostream>
#include <string>
#include <vector>
using namespace std;
using namespace std;
using namespace std::placeholders;
bool shorter_than(const string& l, const string& r)
{
return l.size() < r.size();
}
int main()
{
vector<string> v_original;
v_original.push_back("tiger");
v_original.push_back("cat");
v_original.push_back("lion");
v_original.push_back("cougar");
copy(v_original.begin(), v_original.end(), ostream_iterator<string>(cout, " "));
cout << endl;
string s("meow");
function<bool (const string&)> f = bind(shorter_than, _1, s);
function<bool (const string&)> f_ref = bind(shorter_than, _1, ref(s));
vector<string> v;
// Remove elements that are shorter than s ("meow")
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
// Now change the value of s.
// f_ref, which is bound to ref(s), will use the
// new value, while f is still bound to the old value.
s = "kitty";
// Remove elements that are shorter than "meow" (f is bound to old value of s)
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
// Remove elements that are shorter than "kitty" (f_ref is bound to ref(s))
v = v_original;
v.erase(remove_if(v.begin(), v.end(), f_ref), v.end());
copy(v.begin(), v.end(), ostream_iterator<string>(cout, " "));
cout << endl;
}
tiger cat lion cougar
tiger lion cougar
tiger lion cougar
tiger cougar
swap
Tauscht zwei function
-Objekte.
template <class FT>
void swap(function<FT>& f1, function<FT>& f2);
Parameter
FT
Der vom Funktionsobjekt gesteuerte Typ.
f1
Das erste Funktionsobjekt.
f2
Das zweite Funktionsobjekt.
Hinweise
Die Funktion gibt f1.swap(f2)
zurück.
Beispiel
// std__functional__swap.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val)
{
return (-val);
}
int main()
{
std::function<int (int)> fn0(neg);
std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
std::cout << "val == " << fn0(3) << std::endl;
std::function<int (int)> fn1;
std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
std::cout << std::endl;
swap(fn0, fn1);
std::cout << std::boolalpha << "empty == " << !fn0 << std::endl;
std::cout << std::boolalpha << "empty == " << !fn1 << std::endl;
std::cout << "val == " << fn1(3) << std::endl;
return (0);
}
empty == false
val == -3
empty == true
empty == true
empty == false
val == -3