使用模板中的参数包创建对象
Create object using parameters pack in template
我想创建模板函数,它会根据模板类型名和参数包创建对象。
我创建了一个函数,该函数应该根据模板的类型名称创建对象,我还想将参数包传递给该模板,以便将参数传递给构造函数。这是正确的吗?:
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...);
}
但是编译器 returns 出现错误“'args' 必须在此上下文中扩展参数包”
有没有可能达到我想要达到的目的?
But compiler returns an error " 'args' parameter pack must be expanded in this context"
是:您忘记扩展类型
m_world->AddComponent<TComponent, Args...>(m_id, args...);
// ...................................^^^
正如 Jarod42 所指出的,根据情况,您可以避免显式 Args...
展开
m_world->AddComponent<TComponent>(m_id, args...);
// no more Args...
并让编译器通过 args...
推导类型(但我们应该看到 AddComponent()
定义)。
无论如何,我在你的 CreateComponents()
函数中没有看到错误,但是,正如 François Andrieux 在评论中正确地说的那样,你没有使用完美转发。
这是一个 too-great 需要在答案中解释的论点,但这样一来,您就放弃了移动语义优势(即:您可能会制作一些不必要的副本)。
下面是你的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)...);
} // ..............................^^^^^^^^^^^^^^^^^^^^^^^^
我想创建模板函数,它会根据模板类型名和参数包创建对象。
我创建了一个函数,该函数应该根据模板的类型名称创建对象,我还想将参数包传递给该模板,以便将参数传递给构造函数。这是正确的吗?:
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...);
}
但是编译器 returns 出现错误“'args' 必须在此上下文中扩展参数包”
有没有可能达到我想要达到的目的?
But compiler returns an error " 'args' parameter pack must be expanded in this context"
是:您忘记扩展类型
m_world->AddComponent<TComponent, Args...>(m_id, args...);
// ...................................^^^
正如 Jarod42 所指出的,根据情况,您可以避免显式 Args...
展开
m_world->AddComponent<TComponent>(m_id, args...);
// no more Args...
并让编译器通过 args...
推导类型(但我们应该看到 AddComponent()
定义)。
无论如何,我在你的 CreateComponents()
函数中没有看到错误,但是,正如 François Andrieux 在评论中正确地说的那样,你没有使用完美转发。
这是一个 too-great 需要在答案中解释的论点,但这样一来,您就放弃了移动语义优势(即:您可能会制作一些不必要的副本)。
下面是你的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)...);
} // ..............................^^^^^^^^^^^^^^^^^^^^^^^^