Created
May 11, 2019 20:29
-
-
Save mrange/cd16c23cb6cb5600c7e31df9c6f0410f to your computer and use it in GitHub Desktop.
example on out pointers around unique_ptr
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define _CRT_SECURE_NO_WARNINGS | |
#include <cstdio> | |
#include <memory> | |
#include <type_traits> | |
namespace | |
{ | |
template<typename T> | |
struct unique_out_ptr | |
{ | |
std::unique_ptr<T> * uptr ; | |
T * ptr ; | |
unique_out_ptr (std::unique_ptr<T> & u) noexcept | |
: uptr (&u) | |
, ptr (nullptr) | |
{ | |
} | |
~unique_out_ptr () noexcept | |
{ | |
if (uptr) | |
{ | |
uptr->reset (ptr); | |
uptr = nullptr; | |
ptr = nullptr; | |
} | |
} | |
unique_out_ptr (unique_out_ptr const &) = delete; | |
unique_out_ptr & operator= (unique_out_ptr const &) = delete; | |
unique_out_ptr & operator= (unique_out_ptr &&) = delete; | |
operator T ** () noexcept | |
{ | |
return &ptr; | |
} | |
unique_out_ptr (unique_out_ptr && uop) noexcept | |
: uptr (uop.uptr) | |
, ptr (uop.ptr ) | |
{ | |
uop.uptr = nullptr; | |
uop.ptr = nullptr; | |
} | |
}; | |
template<typename T> | |
auto out_ptr (std::unique_ptr<T> & up) | |
{ | |
return unique_out_ptr<T> (up); | |
} | |
void alloc_int (int ** p) | |
{ | |
*p = new int(3); | |
} | |
} | |
int main() | |
{ | |
std::unique_ptr<int> p; | |
alloc_int (out_ptr (p)); | |
printf("%d\n", *p); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment