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)...));
}
Senza modelli variadic, avrete bisogno di più versioni di 'make_shared', uno per zero argomenti, uno per un argomento, uno per due argomenti , ecc. –
Quale compilatore stai usando? – jalf
@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. –