C ++ make_shared недоступен - PullRequest
       35

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

5 голосов
/ 04 февраля 2012

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

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

Но в моем компиляторе также нет шаблонов с переменными значениями.

1 Ответ

6 голосов
/ 04 февраля 2012

Если ваш компилятор не предоставляет реализацию 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 версии для каждого аргумента: один const Arg & и один Arg &

С поддержкой шаблонов с переменными значениями :

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