模板和通用参考

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 函数的语法没有理解。特别是:

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。此类型无法复制!它只能移动。这是为了确保只有一个唯一句柄拥有该指针的所有权。