If your compiler don't give an implementation of make_shared and you can't use boost, and you don't mind the lack of single-allocation optimization both for the object and the reference counter then make_shared is something like this:
Without variadic template support:
// 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)));
}
// ...
If your compiler don't support r-value references, then make 2 versions for each arguments count: one const Arg& and one Arg&
With variadic template support:
template <typename T, typename... Args>
inline shared_ptr<T> make_shared(Args&&... args)
{
return shared_ptr<T>(new T( std::forward<Args>(args)... ));
}
make_shared
, one for zero arguments, one for one argument, one for two arguments, etc. – Agincourtmake_shared
less powerful in C++03, but you could still have the single-allocation implementation optimization, as well as the exception-safetly that a factory function provides. – ChristcrossT const&
vsT&
. – CyndiT
can be explicitly specified asconst something
, but won't infer that way? Yeah it looks that way: ideone.com/c3VF8 – AgincourtT&
will not deducefoo const&
, onlyfoo&
. That's why Kerrek mentions rvalue references:T&&
can deduce both asfoo&
orfoo&&
– Cyndi