在模板中使用参数包创建对象



我想创建模板函数,该函数将在模板类型和参数包上创建对象。

我创建了一个函数,该函数应该基于模板的TypeName创建对象,我还想将参数包传递给该模板,我要求将参数传递给构造函数。这是正确的吗?:

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

我也想将这些参数传递给这样的另一个fucntion:

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

但编译器返回错误"必须在此上下文中展开'args'参数包"

甚至有可能实现我想实现的目标?

但编译器返回错误"必须在此上下文中展开'args'参数包"

是:您忘记了扩展类型

m_world->AddComponent<TComponent, Args...>(m_id, args...);
// ...................................^^^

根据JAROD42的指向,根据情况,您可以避免明确 Args...扩展

m_world->AddComponent<TComponent>(m_id, args...);
// no more Args...

让编译器通过args...推导类型(但我们应该看到AddComponent()定义(。

无论如何,我没有看到您的CreateComponents()功能中的错误,但是,正如FrançoisAndrieux正确地说,您不会使用完美的转发。

这是一个太好的论点,无法在答案中解释,但是,这样,您就放弃了移动语义的优势(也就是说:您,您可能会制作一些不必要的副本(。

以下是您的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)...);
 } // ..............................^^^^^^^^^^^^^^^^^^^^^^^^

相关内容

  • 没有找到相关文章

最新更新