Но компилятор возвращает ошибку "Пакет параметров 'args' должен быть расширен в этом контексте"
Да: вы забыли расширить типы
m_world->AddComponent<TComponent, Args...>(m_id, args...);
// ...................................^^^
Как указал Jarod42, в зависимости от обстоятельств вы могли бы избежать явного расширения Args...
m_world->AddComponent<TComponent>(m_id, args...);
// no more Args...
и пусть компилятор выводит типы через args...
(но мы должны увидеть определение AddComponent()
).
В любом случае, я не вижу ошибок в вашей функции CreateComponents()
, но, как правильно говорит Франсуа Андрие в комментарии, вы не используете совершенную пересылку.
Это слишком хороший аргумент, чтобы объяснять в ответе, но, таким образом, вы отказываетесь от использования преимуществ семантики (то есть: потенциально вы делаете ненужные копии).
Ниже указана ваша функция CreateComponents()
, обеспечивающая идеальную пересылку
template <typename TComponent, typename ... Args>
void CreateComponent (Args && ... args)
{ // .....................^^ forwarding reference added
std::shared_ptr<TComponent> component
= std::make_shared<TComponent>(std::forward<Args>(args)...);
} // ..............................^^^^^^^^^^^^^^^^^^^^^^^^