How to pass std::unique_ptr around?
c++, c++11, unique-ptr
Solution
If you want the function to use the pointee, pass a reference to it. There's no reason to tie the function to work only with some kind of smart pointer:
bool func(BaseClass& base, int other_arg);
And at the call site use `operator*`:
func(*some_unique_ptr, 42);
Alternatively, if the `base` argument is allowed to be null, keep the signature as is, and use the `get()` member function:
bool func(BaseClass* base, int other_arg);
func(some_unique_ptr.get(), 42);
Problem
I am having my first attempt at using C++11 `unique_ptr`; I am replacing a polymorphic raw pointer inside a project of mine, which is owned by one class, but passed around quite frequently. I used to have functions like: ``` bool func(BaseClass* ptr, int other_arg) { bool val; // plain ordinary function that does something... return val; } ``` But I soon realized that I wouldn't be able to switch to: ``` bool func(std::unique_ptr<BaseClass> ptr, int other_arg); ``` Because the caller would have to handle the pointer ownership to the function, what I don't want to. So, what is the best solution to my problem? I though of passing the pointer as reference, like this: ``` bool func(const std::unique_ptr<BaseClass>& ptr, int other_arg); ``` But I feel very uncomfortable in doing so, firstly because it seems non instinctive to pass something already typed as `_ptr` as reference, what would be a reference of a reference. Secondly because the function signature gets even bigger. Thirdly, because in the generated code, it would be necessary two consecutive pointer indirections to reach my variable.