Si su compilador no proporciona una implementación de make_shared y no puede usar boost, y no le importa la falta de optimización de asignación única para el objeto y el contador de referencia, make_shared es algo como esto :
sin ayuda de la plantilla variadic:
// zero arguments version
template <typename T>
inline shared_ptr<T> make_shared()
{
return shared_ptr<T>(new T());
}
// one argument version
template <typename T, typename Arg1>
inline shared_ptr<T> make_shared(Arg1&& arg1)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1)));
}
// two arguments version
template <typename T, typename Arg1, typename Arg2>
inline shared_ptr<T> make_shared(Arg1&& arg1, Arg2&& arg2)
{
return shared_ptr<T>(new T(std::forward<Arg1>(arg1),
std::forward<Arg2>(arg2)));
}
// ...
Si el compilador no son compatibles con referencias valor R, a continuación, hacer 2 versiones para cada uno de los argumentos cuentan: uno const Arg y unoArg &
Con ayuda de la plantilla variadic:
template <typename T, typename... Args>
inline shared_ptr<T> make_shared(Args&&... args)
{
return shared_ptr<T>(new T(std::forward<Args>(args)...));
}
Sin plantillas variadic, tendrá varias versiones de 'make_shared', uno por cero argumentos, uno para un argumento, una para dos argumentos , etc. –
¿Qué compilador estás usando? – jalf
@BenVoigt: Las plantillas variables no son un gran obstáculo. La ausencia de referencias rvalue hace que 'make_shared' sea menos potente en C++ 03, pero aún podría tener la optimización de la implementación de asignación única, así como la excepción -seguramente que proporciona una función de fábrica. –