Поделиться через


Класс 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