<utility>
– funkce
as_const
template <class T> constexpr add_const_t<T>& as_const(T& t) noexcept;
template <class T> void as_const(const T&&) = delete;
Návratová hodnota
Vrací objekt T
.
declval
template <class T> add_rvalue_reference_t<T> declval() noexcept; // as unevaluated operand
exchange
(C++14)
Přiřadí objektu novou hodnotu a vrátí její starou hodnotu.
template <class T, class Other = T>
T exchange(T& val, Other&& new_val)
Parametry
val
Objekt, který obdrží hodnotu new_val
.
new_val
Objekt, jehož hodnota je zkopírována nebo přesunuta do val
.
Poznámky
U složitých typů exchange
se vyhnete kopírování staré hodnoty, pokud je k dispozici konstruktor přesunutí, zabrání kopírování nové hodnoty, pokud se jedná o dočasný objekt nebo je přesunut, a přijímá jakýkoli typ jako novou hodnotu pomocí libovolného dostupného operátoru převodu přiřazení. Funkce výměny se liší od std::swap
toho, že se levý argument nepřesune nebo zkopíruje do pravého argumentu.
Příklad
Následující příklad ukazuje, jak používat exchange
. Ve skutečném světě exchange
je nejužitečnější u velkých objektů, které jsou nákladné kopírování:
#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
Podmíněně přetypuje svůj argument na odkaz rvalue, pokud je argument hodnota rvalue nebo odkaz rvalue. Tím se období hodnota rvalue argumentu na funkci předání za účelem maximální podpory předávání.
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
Parametry
Type
Typ předané Arg
hodnoty , která se může lišit od typu Arg
. Obvykle určeno argumentem šablony funkce předávání.
Arg
Argument, který chcete přetypovat.
Návratová hodnota
Vrátí odkaz rvalue na Arg
to, zda byla hodnota předaná Arg
původně hodnotou rvalue nebo odkazem na hodnotu rvalue. V opačném případě vrátí hodnotu Arg
beze změny jejího typu.
Poznámky
Je nutné zadat explicitní argument šablony pro volání forward
.
forward
nepředá svůj argument. Místo toho podmíněným přetypováním argumentu na odkaz rvalue, pokud byl původně odkazem rvalue nebo rvalue, forward
umožňuje kompilátoru provádět řešení přetížení s vědomím původního typu přeposlaného argumentu. Zdánlivý typ argumentu pro funkci předávání se může lišit od původního typu – například když se hodnota rvalue použije jako argument funkce a je svázaná s názvem parametru; když má název hodnotu lvalue, s libovolnou hodnotou, která skutečně existuje jako hodnota rvalue, forward
obnoví hodnotu rvalue- ness argumentu.
Obnovení rvalue-ness původní hodnoty argumentu k vyřešení přetížení se označuje jako dokonalé předávání. Dokonalé předávání umožňuje funkci šablony přijmout argument některého typu odkazu a obnovit jeho vlastnost rvalue, když je nezbytná pro správné řešení přetížení. Pomocí dokonalého předávání můžete zachovat sémantiku přesunu pro hodnoty rvalue. Nebude tak nutné poskytovat přetížení pro funkce, které se liší pouze typem odkazu svých argumentů.
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
Získá prvek z objektu pair
podle pozice indexu nebo podle typu.
// 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;
Parametry
Index
Index založený na 0 zvoleném prvku.
T1
Typ prvního párového prvku.
T2
Typ druhého párového prvku.
pr
Dvojice, ze které chcete vybrat.
Poznámky
Funkce šablony vrátí odkaz na prvek jeho pair
argumentu.
U indexovaných přetížení, pokud je hodnota Index
0, vrátí pr.first
funkce a pokud je hodnota Index
1, vrátí pr.second
funkce . RI
Typ je typ vráceného prvku.
U přetížení, které nemají Index
parametr, je prvek, který se má vrátit, odvozen argumentem typu. Volání get<T>(Tuple)
vytvoří chybu kompilátoru, pokud pr
obsahuje více nebo méně než jeden prvek typu T
.
Příklad
#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
Funkce šablony, kterou můžete použít k vytvoření objektů typu pair
, kde jsou typy komponent automaticky vybrány na základě datových typů, které jsou předány jako parametry.
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);
Parametry
Val1
Hodnota, která inicializuje první prvek .pair
Val2
Hodnota, která inicializuje druhý prvek .pair
Návratová hodnota
Objekt páru vytvořený: pair
T
<,U
>(Val1
, ). Val2
Poznámky
make_pair
převede objekt typu reference_wrapper
Třída na odkazové typy a převede rozkládající se pole a funkce na ukazatele.
Ve vráceném pair
objektu T
je určen takto:
Pokud je
reference_wrapper<X>
vstupní typT
, vrácený typT
jeX&
.V opačném případě je
decay<T>::type
vrácený typT
. Pokuddecay
třída není podporována, vrácený typT
je stejný jako vstupní typT
.
Vrácený typ U
je podobně určen ze vstupního typu U
.
Jednou z make_pair
výhod je, že typy objektů, které jsou uloženy, jsou určeny automaticky kompilátorem a nemusí být explicitně zadány. Nepoužívejte explicitní argumenty šablony, jako make_pair<int, int>(1, 2)
je při použití make_pair
, protože se jedná o podrobné a přidává komplexní problémy s odkazem na rvalue, které by mohly způsobit selhání kompilace. V tomto příkladu by správná syntaxe byla make_pair(1, 2)
Pomocná make_pair
funkce také umožňuje předat funkci dvě hodnoty, které vyžadují pár jako vstupní parametr.
Příklad
Příklad použití pomocné funkce make_pair
k deklaraci a inicializaci páru naleznete v tématu pair
Struktura.
move
Bezpodmínečně přetypuje svůj argument na odkaz hodnoty rvalue a značí, že ji lze přesunout, pokud je pro její typ přesunutí povoleno.
template <class Type>
constexpr typename remove_reference<Type>::type&& move(Type&& Arg) noexcept;
Parametry
Type
Typ vyvolaný z typu předaného Arg
argumentu spolu s referenčními sbalovacími pravidly.
Arg
Argument, který chcete přetypovat. Ačkoli se zdá, že typ Arg
je zadán jako odkaz rvalue, přijímá také argumenty lvalue, move
protože odkazy lvalue mohou svázat s odkazy rvalue.
Návratová hodnota
Arg
jako odkaz rvalue, zda jeho typ je typ odkazu.
Poznámky
Argument šablony Type
není určen explicitně, ale má být odvozen z typu předané Arg
hodnoty . Typ Type
je dále upraven podle pravidel sbalení odkazů.
move
nepřesune svůj argument. Místo toho bezpodmínečně přetypováním argumentu ( což může být lvalue) na odkaz rvalue, umožňuje kompilátoru následně přesunout místo kopírování hodnotu předanou Arg
, pokud je její typ povolen pro přesunutí. Pokud jeho typ není povolený, zkopíruje se místo toho.
Pokud je předaná Arg
hodnota lvalue – to znamená, že má název nebo jeho adresu, je možné ji vzít – při přesunu se zneplatní. Po přesunutí neodkazujte na hodnotu předanou Arg
jejím názvem nebo adresou.
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
Vymění prvky dvou typů nebo pair
objektů Structure .
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);
Parametry
left
Objekt typu nebo typu pair
.
right
Objekt typu nebo typu pair
.
Poznámky
Jednou z swap
výhod je, že typy objektů, které jsou uloženy, jsou určeny automaticky kompilátorem a nemusí být explicitně zadány. Nepoužívejte explicitní argumenty šablony, jako swap<int, int>(1, 2)
je při použití swap
, protože se jedná o podrobné a přidává komplexní problémy s odkazem na rvalue, které by mohly způsobit selhání kompilace.
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);
Poznámky
Převede hodnotu na řetězec znaků vyplněním oblasti [first, last)
, kde [first, last)
je nutné, aby byla platná oblast.