gpt4 book ai didi

c++ - 使用模板中的参数包创建对象

转载 作者:行者123 更新时间:2023-11-30 02:15:22 24 4
gpt4 key购买 nike

我想创建模板函数,它会根据模板类型名和参数包创建对象。

我创建了一个函数,该函数应该根据模板的类型名称创建对象,并且我还想将参数包传递给该模板,以便将参数传递给构造函数。这是正确的吗?:

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'参数包必须在此上下文中展开”

是否有可能实现我想要实现的目标?

最佳答案

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 在评论中正确指出的那样,您没有使用完美转发。

在答案中解释这个论点太过分了,但是这样一来,您就放弃了移动语义优势(也就是说:您可能会制作一些不必要的拷贝)。

下面是你实现完美转发的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)...);
} // ..............................^^^^^^^^^^^^^^^^^^^^^^^^

关于c++ - 使用模板中的参数包创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56263804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com