2012-02-03 26 views
5

Mientras tengo std::tr1::shared_ptr<T> disponible en mi compilador, no tengo tengo make_shared.C++ make_shared no disponible

¿Alguien me puede indicar una implementación adecuada de make_shared? Veo que necesito usar varargs para proporcionar argumentos al constructor de T.

Pero no tengo plantillas variadic disponibles en mi compilador también.

+2

Sin plantillas variadic, tendrá varias versiones de 'make_shared', uno por cero argumentos, uno para un argumento, una para dos argumentos , etc. –

+0

¿Qué compilador estás usando? – jalf

+0

@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. –

Respuesta

6

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)...)); 
} 
+0

La versión variad de Gigi también deja una traza inversa adecuada como se discute aquí: http://stackoverflow.com/questions/9233358/debuggable-replacement- for-make-shared – srking

Cuestiones relacionadas