As a follow up to this post I wonder how its implementation of make_unique
plays with allocating function-temporary buffer arrays such as in the following code.
f()
{
auto buf = new int[n]; // temporary buffer
// use buf ...
delete [] buf;
}
Can this be replaced with some call to make_unique
and will the []
-version of delete be used then?
Here is another solution (in addition to Mike's):
#include <type_traits>
#include <utility>
#include <memory>
template <class T, class ...Args>
typename std::enable_if
<
!std::is_array<T>::value,
std::unique_ptr<T>
>::type
make_unique(Args&& ...args)
{
return std::unique_ptr<T>(new T(std::forward<Args>(args)...));
}
template <class T>
typename std::enable_if
<
std::is_array<T>::value,
std::unique_ptr<T>
>::type
make_unique(std::size_t n)
{
typedef typename std::remove_extent<T>::type RT;
return std::unique_ptr<T>(new RT[n]);
}
int main()
{
auto p1 = make_unique<int>(3);
auto p2 = make_unique<int[]>(3);
}
Notes:
So make_unique(n) should just default construct n T's.
These are not unanswerable questions. But they are questions that haven't yet been fully answered.