2012-02-03 15 views
5

Mentre ho il std::tr1::shared_ptr<T> disponibile nel mio compilatore, non ho make_shared.C++ make_shared non disponibile

Qualcuno può indicarmi una corretta implementazione di make_shared? Vedo che ho bisogno di usare varargs di fornire argomenti al costruttore di T.

Ma non ho modelli variadic disponibili nel mio compilatore pure.

+2

Senza modelli variadic, avrete bisogno di più versioni di 'make_shared', uno per zero argomenti, uno per un argomento, uno per due argomenti , ecc. –

+0

Quale compilatore stai usando? – jalf

+0

@BenVoigt: I modelli Variadic non sono un enorme ostacolo, però. L'assenza di riferimenti rvalue rende 'make_shared' meno potente in C++ 03, ma si può ancora avere l'ottimizzazione dell'implementazione a singola allocazione, nonché l'eccezione-safetly fornita da una funzione factory. –

risposta

6

Se il tuo compilatore non fornisce un'implementazione di make_shared e non puoi usare boost, e non ti interessa la mancanza di ottimizzazione a singola allocazione sia per l'oggetto che per il contatore di riferimento, allora make_shared è qualcosa come questo :

senza il supporto template 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))); 
} 

// ... 

Se il compilatore non supportano i riferimenti R-valore, poi fare 2 versioni per ogni argomenti contano: una const Arg & e uno Arg &

Con il supporto template 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 versione variadica di Gigi lascia anche un backtrace appropriato come discusso qui: http://stackoverflow.com/questions/9233358/debuggable-replacement- per-fare-condivisa – srking

Problemi correlati