(no title)
michaelrmmiller | 12 years ago
A similar alternative would be to template the deleter on the type of the function and then a specific function. This way you can wrap functions with non-void return values. Something like:
template<typename FuncType, FuncType& F> struct deleter { ... };
using unique_cptr = std::unique_ptr<void, deleter<decltype(free), free>>;
The other cool thing I learned recently is you can actually use the custom deleter to override the wrapped type by typedef'ing pointer in your deleter class. You can use this to wrap C-style file descriptors in a unique_ptr.
humanrebar|12 years ago
That's why the suggest a make_window function at the bottom of the post. The end-user just calls:
The optimizer should inline all the extra wrappers away, so there's no overhead for doing as the article suggests.michaelrmmiller|12 years ago
It also obscures the type of the object. That can be okay if it's only used as a temporary local, but problematic if you ever need to store it as a member or return it from another function. The type signature is verbose and not very descriptive, either. Compare that to:
If you wanted to do something like what they have, I would create a variant on C++14's std::make_unique. That could look like: That looks a lot cleaner to me, at least. And instead of having to write a new function for each type, you just add a new deleter_traits specialization.(I haven't actually compiled any of this so it's probably riddled with syntax errors... hopefully the point still comes across!)