Возвращение shared_ptr из функции

Я очень плохо знаком с C ++ 11, все еще очень экспериментирую с расширениями. Я нахожу auto Ключевое слово очень удобно, особенно при работе с переменными шаблона. Это означает, что с учетом

template<typename ... Types>
struct Foo
{
};

template<typename ... Types>
Foo<Types ...>* create( Types ... types ... )
{
return new Foo<Types ...>;
}

Теперь я могу сделать назначение

auto t1 = create( 'a' , 42 , true , 1.234 , "str" );

вместо

Foo<char, int, bool, double , const char*>* t2 = create( 'a' , 42 , true , 1.234 , "str" );

Проблема в том, что сейчас t1 это указатель, я хотел бы держать его в shared_ptr как рекомендовал Херб Саттер. Поэтому я хотел бы сохранить возвращаемое значение create() в shared_ptr без необходимости называть типы аргументов шаблона, как в t2,

2

Решение

Избегайте использования сырых указателей все вместе. использование std::make_shared а также make_unique (не правильно в стандарте) вместо new, затем auto будет хорошо работать Например.

template <typename ...Args>
auto create(Args&&... args)
-> std::shared_ptr<Foo<typename std::decay<Args>::type...>>
{
return std::make_shared<Foo<typename std::decay<Args>::type...>>(
std::forward<Args>(args)...);
}
3

Другие решения

Это слишком долго, чтобы оставлять комментарии. Поэтому я выкладываю это здесь вместо этого. Кроме того, это может быть ответом.

@nosid почему бы не следующее. Это менее запутанный.

template<typename ... Types>
struct Foo
{
Foo( Types ... types ... ) : m_data( types ...)
{
}

std::tuple<Types...>    m_data;
};

template<typename ... Types>
std::shared_ptr<Foo<Types ...> > create( Types ... types ... )
{
return std::make_shared<Foo<Types ...> >( types ... );
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector