Класс reference_wrapper
Создает оболочку для ссылки.
Синтаксис
template <class Ty>
class reference_wrapper
{
typedef Ty type;
reference_wrapper(Ty&) noexcept;
operator Ty&() const noexcept;
Ty& get() const noexcept;
template <class... Types>
auto operator()(Types&&... args) const ->
decltype(std::invoke(get(), std::forward<Types>(args)...));
};
Замечания
reference_wrapper<Ty>
— это конструируемый и назначаемый копированием класс-оболочка вокруг ссылки на объект или функцию типа Ty
. Он содержит указатель на объект этого типа. reference_wrapper
может использоваться для хранения ссылок в стандартных контейнерах и для передачи объектов по ссылке на std::bind
.
Тип Ty
должен иметь тип "Объект" или "Функция". В противном случае статическое утверждение во время компиляции завершится ошибкой.
Вспомогательные функции std::ref и std::cref можно использовать для создания объектов reference_wrapper
.
Участники
Конструкторы
Имя | Описание |
---|---|
reference_wrapper | Создает документ reference_wrapper . |
Определения типов
Имя | Описание |
---|---|
result_type | Слабый тип результата ссылки в оболочке. |
type | Тип ссылки в оболочке. |
Функции
Имя | Описание |
---|---|
get | Получает ссылку в оболочке. |
Операторы
Имя | Описание |
---|---|
operator Ty& |
Получает указатель на ссылку в оболочке. |
operator() | Вызывает ссылку в оболочке. |
get
Получает ссылку в оболочке.
Ty& get() const noexcept;
Замечания
Функция-член возвращает ссылку в оболочке.
Пример
// std__functional__reference_wrapper_get.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int main() {
int i = 1;
std::reference_wrapper<int> rwi(i);
std::cout << "i = " << i << std::endl;
std::cout << "rwi = " << rwi << std::endl;
rwi.get() = -1;
std::cout << "i = " << i << std::endl;
return (0);
}
i = 1
rwi = 1
i = -1
оператор Ty&
Получение ссылки в оболочке.
operator Ty&() const noexcept;
Замечания
Оператор-член возвращает *ptr
.
Пример
// std__functional__reference_wrapper_operator_cast.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int main() {
int i = 1;
std::reference_wrapper<int> rwi(i);
std::cout << "i = " << i << std::endl;
std::cout << "(int)rwi = " << (int)rwi << std::endl;
return (0);
}
i = 1
(int)rwi = 1
operator()
Вызывает ссылку в оболочке.
template <class... Types>
auto operator()(Types&&... args);
Параметры
Типы
Типы списка аргументов.
args
Список аргументов.
Замечания
Элемент шаблона operator()
возвращает std::invoke(get(), std::forward<Types>(args)...)
.
Пример
// std__functional__reference_wrapper_operator_call.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val) {
return (-val);
}
int main() {
std::reference_wrapper<int (int)> rwi(neg);
std::cout << "rwi(3) = " << rwi(3) << std::endl;
return (0);
}
rwi(3) = -3
reference_wrapper
Создает документ reference_wrapper
.
reference_wrapper(Ty& val) noexcept;
Параметры
Ty
Тип для упаковки.
Val
Значение для упаковки.
Замечания
Конструктор устанавливает сохраненное значение ptr
в &val
.
Пример
// std__functional__reference_wrapper_reference_wrapper.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val) {
return (-val);
}
int main() {
int i = 1;
std::reference_wrapper<int> rwi(i);
std::cout << "i = " << i << std::endl;
std::cout << "rwi = " << rwi << std::endl;
rwi.get() = -1;
std::cout << "i = " << i << std::endl;
return (0);
}
i = 1
rwi = 1
i = -1
result_type
Слабый тип результата ссылки в оболочке.
typedef R result_type;
Замечания
Определение типа result_type
является синонимом слабого типа результата функции в оболочке. Это определение типа имеет смысл только для типов функций.
Пример
// std__functional__reference_wrapper_result_type.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val) {
return (-val);
}
int main() {
typedef std::reference_wrapper<int (int)> Mywrapper;
Mywrapper rwi(neg);
Mywrapper::result_type val = rwi(3);
std::cout << "val = " << val << std::endl;
return (0);
}
val = -3
type
Тип ссылки в оболочке.
typedef Ty type;
Замечания
Определение типа является синонимом параметра шаблона Ty
.
Пример
// std__functional__reference_wrapper_type.cpp
// compile with: /EHsc
#include <functional>
#include <iostream>
int neg(int val) {
return (-val);
}
int main() {
int i = 1;
typedef std::reference_wrapper<int> Mywrapper;
Mywrapper rwi(i);
Mywrapper::type val = rwi.get();
std::cout << "i = " << i << std::endl;
std::cout << "rwi = " << val << std::endl;
return (0);
}
i = 1
rwi = 1