Aquí hay otra solución (además de Mike):
#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);
}
Notas:
- nuevo T [n] debería simplemente construir por defecto n T's.
Así que make_unique (n) debería simplemente construir por defecto n T's.
- Problemas como este contribuyeron a que make_unique no se haya propuesto en C++ 11. Otro problema es: ¿Manejamos eliminadores personalizados?
Estas no son preguntas sin respuesta. Pero son preguntas que aún no han sido respondidas completamente.
... pero estas preguntas han sido (parcialmente) respondidas en C++ 14, y make_unique es ahora [más rico] (http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique). – einpoklum
@einpoklum: Correcto. Tenga en cuenta la fecha en la Q/A. –