Skip to content

Instantly share code, notes, and snippets.

@mrange
Created May 11, 2019 20:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mrange/cd16c23cb6cb5600c7e31df9c6f0410f to your computer and use it in GitHub Desktop.
Save mrange/cd16c23cb6cb5600c7e31df9c6f0410f to your computer and use it in GitHub Desktop.
example on out pointers around unique_ptr
#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