С++ make_shared недоступен

Пока у меня есть std::tr1::shared_ptr<T>, доступный в моем компиляторе, я не имеют make_shared.

Может ли кто-нибудь указать мне на правильную реализацию make_shared? я вижу что мне нужно использовать varargs для предоставления аргументов конструктору T.

Но у меня нет вариационных шаблонов, доступных в моем компиляторе.

Ответ 1

Если ваш компилятор не дает реализацию make_shared, и вы не можете использовать boost, и вы не возражаете против отсутствия оптимизации с одним распределением как для объекта, так и для счетчика ссылок, тогда make_shared выглядит примерно так:

Без поддержки вариационного шаблона:

// 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)));
}

// ...

Если ваш компилятор не поддерживает ссылки r-значения, тогда сделайте 2 версии для каждого аргумента count: one const Arg & и один Arg </p>

Поддержка переменных шаблонов:

template <typename T, typename... Args>
inline shared_ptr<T> make_shared(Args&&... args)
{
  return shared_ptr<T>(new T( std::forward<Args>(args)... ));
}