模板和通用参考
Templates and universal references
我正在学习有关创建实体组件框架的教程。它使用组合(一个实体有一组组件)。
class Component
{
public:
Entity* entity;
//VIRTUAL VOID INITIALIZE, DRAW, UPDATE functions here
private:
std::unique_ptr<Entity> m_pEntity;
};
class Entity
{
public:
//Add component function
template <typename T, typename... TArgs>
T& addComponent(TArgs&&... mArgs)
{
T* LComponent(new T(std::forward<TArgs>(mArgs)));
LComponent->entity = this;
std::unique_ptr<Component> uPtr{ LComponent };
m_pComponents.emplace_back(std::move(uPtr));
m_ComponentArray[getComponentTypeID<T>()] = LComponent;
LComponent->ECS_init();
return *LComponent;
}
private:
bool m_IsActive = true;
std::vector <std::unique_ptr<Component>> m_pComponents;
std::array<Component*, gMaxComponents> m_ComponentArray;
};
但是,作者并没有很好地解释背后的逻辑,我对 addComponent 函数的语法没有理解。特别是:
- 为什么在将
uPtr
添加到向量时需要将其转换为右值引用
m_pComponents.emplace_back(std::move(uPtr))
Why does it need to cast uPtr
to a rvalue reference
m_pComponents.emplace_back(std::move(uPtr))
when it adds it to the
vector
这是因为 uPtr
的类型是 std::unique_ptr
。此类型无法复制!它只能移动。这是为了确保只有一个唯一句柄拥有该指针的所有权。
我正在学习有关创建实体组件框架的教程。它使用组合(一个实体有一组组件)。
class Component
{
public:
Entity* entity;
//VIRTUAL VOID INITIALIZE, DRAW, UPDATE functions here
private:
std::unique_ptr<Entity> m_pEntity;
};
class Entity
{
public:
//Add component function
template <typename T, typename... TArgs>
T& addComponent(TArgs&&... mArgs)
{
T* LComponent(new T(std::forward<TArgs>(mArgs)));
LComponent->entity = this;
std::unique_ptr<Component> uPtr{ LComponent };
m_pComponents.emplace_back(std::move(uPtr));
m_ComponentArray[getComponentTypeID<T>()] = LComponent;
LComponent->ECS_init();
return *LComponent;
}
private:
bool m_IsActive = true;
std::vector <std::unique_ptr<Component>> m_pComponents;
std::array<Component*, gMaxComponents> m_ComponentArray;
};
但是,作者并没有很好地解释背后的逻辑,我对 addComponent 函数的语法没有理解。特别是:
- 为什么在将
uPtr
添加到向量时需要将其转换为右值引用m_pComponents.emplace_back(std::move(uPtr))
Why does it need to cast
uPtr
to a rvalue referencem_pComponents.emplace_back(std::move(uPtr))
when it adds it to the vector
这是因为 uPtr
的类型是 std::unique_ptr
。此类型无法复制!它只能移动。这是为了确保只有一个唯一句柄拥有该指针的所有权。