std::out_ptr
| Определено в заголовочном файле <memory>
|
||
template< class Pointer = void, class Smart, class... Args > auto out_ptr( Smart& s, Args&&... args ); |
(начиная с C++23) | |
Возвращает std::out_ptr_t с выведенными аргументами шаблона, который захватывает аргументы для сброса по ссылке.
Программа некорректна, если построение возвращаемого значения (смотрите ниже) некорректно.
Параметры
| s | — | объект (обычно умный указатель) для адаптации |
| args... | — | аргументы для сброса при захвате |
Возвращаемое значение
std::out_ptr_t<Smart, P, Args&&>(s, std::forward<Args>(args)...), где P
Pointer, еслиPointerне совпадает сvoid. Иначе,Smart::pointer, если он действителен и обозначает тип. Иначе,Smart::element_type*, еслиSmart::element_typeявляется допустимым и обозначает тип. Иначе,std::pointer_traits<Smart>::element_type*.
Примечание
Пользователи могут указать аргумент шаблона для параметра шаблона Pointer, чтобы взаимодействовать с внешними функциями, которые принимают Pointer*.
Поскольку все аргументы для сброса захватываются по ссылке, чтобы избежать висячих ссылок возвращаемый out_ptr_t должен быть временным объектом, уничтожаемым в конце полного выражения, содержащего вызов сторонней функции.
| Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
|---|---|---|---|
__cpp_lib_out_ptr |
202106L |
(C++23) | std::out_ptr, std::inout_ptr
|
Пример
Используйте std::out_ptr, чтобы адаптировать умный указатель для sqlite3_open, который ожидает sqlite3** в качестве выходного параметра.
#include <memory>
#include <sqlite3.h>
int main()
{
auto close_db = [](sqlite3* db) { sqlite3_close(db); };
{
// открыть базу данных в памяти и управлять её временем жизни
// с помощью std::unique_ptr
std::unique_ptr<sqlite3, decltype(close_db)> up;
sqlite3_open(":память:", std::out_ptr(up));
sqlite3* db = up.get();
// сделать что-нибудь с db ...
}
{
// то же, что и выше, но использует std::shared_ptr
std::shared_ptr<sqlite3> sp;
sqlite3_open(":память:", std::out_ptr(sp, close_db));
sqlite3* db = sp.get();
// сделать что-нибудь с db ...
}
}
Смотрите также
(C++23) |
создаёт inout_ptr_t с ассоциированным умным указателем и сбрасывает аргументы (шаблон функции) |
(C++14)(C++20) |
создаёт уникальный указатель, который управляет новым объектом (шаблон функции) |
| создаёт общий указатель, который управляет новым объектом (шаблон функции) |