funciones<utility>
as_const
template <class T> constexpr add_const_t<T>& as_const(T& t) noexcept;
template <class T> void as_const(const T&&) = delete;
Valor devuelto
Devuelve T
.
declval
template <class T> add_rvalue_reference_t<T> declval() noexcept; // as unevaluated operand
exchange
(C++14)
Asigna un nuevo valor a un objeto y devuelve su valor anterior.
template <class T, class Other = T>
T exchange(T& val, Other&& new_val)
Parámetros
val
El objeto que va a recibir el valor de new_val
.
new_val
El objeto cuyo valor se ha copiado o movido a val
.
Comentarios
En el caso de los tipos complejos, exchange
evita copiar el valor anterior cuando un constructor de movimiento está disponible, evita copiar el nuevo valor si es un objeto temporal o se mueve y acepta cualquier tipo como nuevo valor, usando cualquier operador de asignación de conversión disponible. La función exchange es diferente de std::swap
en cuanto a que el argumento izquierdo no se mueve ni se copia en el argumento derecho.
Ejemplo
En el ejemplo siguiente se muestra cómo utilizar exchange
. En el mundo real, exchange
resulta más útil con objetos grandes que cuesta mucho copiar:
#include <utility>
#include <iostream>
using namespace std;
struct C
{
int i;
//...
};
int main()
{
// Use brace initialization
C c1{ 1 };
C c2{ 2 };
C result = exchange(c1, c2);
cout << "The old value of c1 is: " << result.i << endl;
cout << "The new value of c1 after exchange is: " << c1.i << endl;
return 0;
}
The old value of c1 is: 1
The new value of c1 after exchange is: 2
forward
Convierte condicionalmente su argumento a una referencia de valor R si el argumento es un valor R o una referencia de valor R. Esto restaura el valor R de un argumento a la función de reenvío para permitir el reenvío directo.
template <class Type> // accepts lvalues
constexpr Type&& forward(typename remove_reference<Type>::type& Arg) noexcept
template <class Type> // accepts everything else
constexpr Type&& forward(typename remove_reference<Type>::type&& Arg) noexcept
Parámetros
Type
Tipo del valor pasado en Arg
, que puede ser diferente que el tipo de Arg
. Lo suele determinar un argumento de plantilla de la función de reenvío.
Arg
Argumento que se va a convertir.
Valor devuelto
Devuelve una referencia de valor R a Arg
si el valor pasado en Arg
era originalmente un valor R o una referencia a un valor R; de lo contrario, devuelve Arg
sin modificar su tipo.
Comentarios
Debe especificar un argumento de plantilla explícito para llamar a forward
.
forward
no reenvía su argumento. En su lugar, convirtiendo condicionalmente su argumento a una referencia de valor R si era originalmente un valor R o una referencia de valor R, forward
permite al compilador realizar la resolución de sobrecargas conociendo del tipo original del argumento reenviado. Es posible que el tipo aparente de un argumento de una función de reenvío sea diferente de su tipo original, por ejemplo, cuando se usa un rvalue como argumento de una función y se enlaza a un nombre de parámetro. Si tiene un nombre se convierte en un lvalue con cualquier valor que exista realmente como rvalue. forward
restaura el rvalue del argumento.
Restaurar el rvalue del valor original de un argumento para hacer la resolución de sobrecargas se denomina reenvío directo. El reenvío directo permite que una función de plantilla acepte un argumento de cualquier tipo de referencia y restaure su valor R cuando sea necesario para la correcta resolución de sobrecargas. Mediante el reenvío directo, se puede conservar la semántica de movimiento para los valores R y evitar tener que proporcionar sobrecargas para las funciones que solo varían por el tipo de referencia de sus argumentos.
from_chars
from_chars_result from_chars(const char* first, const char* last, see below& value, int base = 10);
from_chars_result from_chars(const char* first, const char* last, float& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, double& value, chars_format fmt = chars_format::general);
from_chars_result from_chars(const char* first, const char* last, long double& value, chars_format fmt = chars_format::general);
get
Obtiene un elemento de un objeto pair
, por posición de índice o por tipo.
// get reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr tuple_element_t<Index, pair<T1, T2>>&
get(pair<T1, T2>& Pr) noexcept;
// get reference to element T1 in pair Pr
template <class T1, class T2>
constexpr T1& get(pair<T1, T2>& Pr) noexcept;
// get reference to element T2 in pair Pr
template <class T2, class T1>
constexpr T2& get(pair<T1, T2>& Pr) noexcept;
// get const reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr const tuple_element_t<Index, pair<T1, T2>>&
get(const pair<T1, T2>& Pr) noexcept;
// get const reference to element T1 in pair Pr
template <class T1, class T2>
constexpr const T1& get(const pair<T1, T2>& Pr) noexcept;
// get const reference to element T2 in pair Pr
template <class T2, class T1>
constexpr const T2& get(const pair<T1, T2>& Pr) noexcept;
// get rvalue reference to element at Index in pair Pr
template <size_t Index, class T1, class T2>
constexpr tuple_element_t<Index, pair<T1, T2>>&&
get(pair<T1, T2>&& Pr) noexcept;
// get rvalue reference to element T1 in pair Pr
template <class T1, class T2>
constexpr T1&& get(pair<T1, T2>&& Pr) noexcept;
// get rvalue reference to element T2 in pair Pr
template <class T2, class T1>
constexpr T2&& get(pair<T1, T2>&& Pr) noexcept;
Parámetros
Index
El índice de base 0 del elemento elegido.
T1
El tipo del primer elemento par.
T2
El tipo del segundo elemento par.
pr
Par del que se selecciona.
Comentarios
Las funciones de plantilla devuelven una referencia a un elemento de su argumento pair
.
En el caso de sobrecargas indexadas, si el valor de Index
es 0, las funciones devuelven pr.first
y si el valor de Index
es 1, las funciones devuelven pr.second
. El tipo RI
es el tipo del elemento devuelto.
En el caso de las sobrecargas que no tienen un parámetro de Index
, el elemento para devolver se deduce mediante el argumento de tipo. Al llamar a get<T>(Tuple)
se producirá un error de compilador si pr
contiene más o menos de un elemento de tipo T
.
Ejemplo
#include <utility>
#include <iostream>
using namespace std;
int main()
{
typedef pair<int, double> MyPair;
MyPair c0(9, 3.14);
// get elements by index
cout << " " << get<0>(c0);
cout << " " << get<1>(c0) << endl;
// get elements by type (C++14)
MyPair c1(1, 0.27);
cout << " " << get<int>(c1);
cout << " " << get<double>(c1) << endl;
}
9 3.14
1 0.27
index_sequence
template<size_t... I>
using index_sequence = integer_sequence<size_t, I...>;
index_sequence_for
template<class... T>
using index_sequence_for = make_index_sequence<sizeof...(T)>;
make_index_sequence
template<size_t N>
using make_index_sequence = make_integer_sequence<size_t, N>;
make_integer_sequence
template<class T, T N>
using make_integer_sequence = integer_sequence<T, see below >;
make_pair
Una función de plantilla que se usa para construir objetos de tipo pair
, donde los tipos de componente se eligen automáticamente basándose en los tipos de datos que se pasan como parámetros.
template <class T, class U>
pair<T, U> make_pair(T& Val1, U& Val2);
template <class T, class U>
pair<T, U> make_pair(T& Val1, U&& Val2);
template <class T, class U>
pair<T, U> make_pair(T&& Val1, U& Val2);
template <class T, class U>
pair<T, U> make_pair(T&& Val1, U&& Val2);
Parámetros
Val1
Valor que inicializa el primer elemento de pair
.
Val2
Valor que inicializa el segundo elemento de pair
.
Valor devuelto
El objeto de par que se construye: pair
<T
,U
>(Val1
, Val2
).
Comentarios
make_pair
convierte los objetos de tipo Clase reference_wrapper
en tipos de referencia y convierte las matrices y funciones que decaen en punteros.
En el objeto pair
devuelto, T
se determina como sigue:
Si el tipo de entrada
T
esreference_wrapper<X>
, el tipo devueltoT
esX&
.De lo contrario, el tipo devuelto
T
esdecay<T>::type
. Si Clasedecay
no se admite, el tipo devueltoT
es igual que el tipo de entradaT
.
El tipo devuelto U
se determina de igual forma a partir del tipo de entrada U
.
Una ventaja de make_pair
es que el compilador determina automáticamente los tipos de objetos que se almacenan y no tienen que especificarse explícitamente. No utilice los argumentos de plantilla explícitos como make_pair<int, int>(1, 2)
cuando use make_pair
porque es detallado y agrega problemas complejos de referencia rvalue que pueden producir un error de compilación. En este ejemplo, la sintaxis correcta sería make_pair(1, 2)
.
La función del asistente make_pair
también permite pasar dos valores a una función que requiera un par como un parámetro de entrada.
Ejemplo
Para obtener un ejemplo sobre cómo usar la función del asistente make_pair
para declarar e inicializar un par, consulte Estructurapair
.
move
Convierte incondicionalmente su argumento en una referencia rvalue y de este modo indica que se puede mover si su tipo tiene habilitado el movimiento.
template <class Type>
constexpr typename remove_reference<Type>::type&& move(Type&& Arg) noexcept;
Parámetros
Type
Un tipo inferido a partir del tipo del argumento pasado en Arg
, junto con las reglas de contracción de referencias.
Arg
Argumento que se va a convertir. Aunque el tipo de Arg
parece estar especificado como una referencia rvalue, move
también acepta argumentos lvalue porque las referencias lvalue pueden enlazarse con las referencias rvalue.
Valor devuelto
Arg
como referencia rvalue, independientemente de si su tipo es un tipo de referencia.
Comentarios
El argumento de plantilla Type
no está pensado para especificarse explícitamente, sino para deducirse a partir del tipo del valor pasado en Arg
. El tipo de Type
se ajusta más en función de las reglas de contracción de referencias.
move
no mueve su argumento. En lugar de esto, al convertir incondicionalmente su argumento (que podría ser un lvalue) en una referencia rvalue, permite al compilador mover posteriormente, en lugar de copiar, el valor pasado en Arg
si su tipo tiene habilitado el movimiento. Si su tipo no está habilitado para el movimiento, se copia en su lugar.
Si el valor pasado en Arg
es lvalue (es decir, tiene nombre o se puede tomar su dirección), se invalida cuando se produce el movimiento. No haga referencia al valor pasado en Arg
por su nombre o dirección una vez que se haya movido.
move_if_noexcept
template <class T> constexpr conditional_t< !is_nothrow_move_constructible_v<T> && is_copy_constructible_v<T>, const T&, T&&> move_if_noexcept(T& x) noexcept;
swap
Intercambia los elementos de dos tipos u objetos pair
Estructura.
template <class T>
void swap(T& left, T& right) noexcept(see below );
template <class T, size_t N>
void swap(T (&left)[N], T (&right)[N]) noexcept(is_nothrow_swappable_v<T>);
template <class T, class U>
void swap(pair<T, U>& left, pair<T, U>& right);
Parámetros
left
Objeto de tipo o tipo pair
.
right
Objeto de tipo o tipo pair
.
Comentarios
Una ventaja de swap
es que el compilador determina automáticamente los tipos de objetos que se almacenan y no tienen que especificarse explícitamente. No utilice los argumentos de plantilla explícitos como swap<int, int>(1, 2)
cuando use swap
porque es detallado y agrega problemas complejos de referencia rvalue que pueden producir un error de compilación.
to_chars
to_chars_result to_chars(char* first, char* last, see below value, int base = 10);
to_chars_result to_chars(char* first, char* last, float value);
to_chars_result to_chars(char* first, char* last, double value);
to_chars_result to_chars(char* first, char* last, long double value);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt);
to_chars_result to_chars(char* first, char* last, float value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, double value, chars_format fmt, int precision);
to_chars_result to_chars(char* first, char* last, long double value, chars_format fmt, int precision);
Comentarios
Convierte el valor en una cadena de caracteres al rellenar el intervalo [first, last)
, donde [first, last)
es necesario que sea un intervalo válido.