Создать объект, используя пакет параметров в шаблоне - PullRequest
1 голос
/ 22 мая 2019

Я хотел бы создать функцию шаблона, которая создала бы объект на основе typename шаблона и пакета параметров.

Я создал функцию, которая должна создавать объект на основе typename из шаблона, и мне также хотелось быпередать пакет параметров в этот шаблон, чтобы передать параметры конструктору.Это правильно?:

template<typename TComponent, typename... Args>
    void CreateComponent(Args... args) 
    {
        std::shared_ptr<TComponent> component = std::make_shared<TComponent>(args ...);
    }

Я также хотел передать эти параметры другой функции, подобной этой:

template<typename TComponent, typename... Args>
    void AddComponent(Args... args) 
    {
          m_world->AddComponent<TComponent, Args>(m_id, args...);
    }

Но компилятор возвращает ошибку "Пакет параметров" args "должен быть расширенв этом контексте "

Можно ли достичь того, чего я хочу достичь?

1 Ответ

3 голосов
/ 22 мая 2019

Но компилятор возвращает ошибку "Пакет параметров '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)...);
 } // ..............................^^^^^^^^^^^^^^^^^^^^^^^^
...