有人可以帮我启发这个模板吗?

Can someone help me enlighten this template?

我知道这个标题很糟糕,只是我真的不确定还能怎么问这个问题,因为我缺乏许多基本 C++ 功能的知识,我正试图一一解决它们。

所以我开始研究 C++ 模板。现在我正在构建非常基本的,只是为了帮助我调试我的代码,比如:

    void printVectors(const T& vec, const S& vec2) {
        for (int i = 0; i < vec.size(); i++) {
            print("------------");
            printNoEndln(vec[i]);
            printNoEndln("->");
            print(vec2[i]);
        }
    }

现在,从 SDL 开始,我遇到了这样的事情:

    template <typename T, typename... TArgs>
    T& AddComponent(TArgs&&... args) {
        T* newComponent(new T(std::forward<TArgs>(args)...));
        newComponent->componentName = typeid(T).name();
        newComponent->owner = this;
        components.emplace_back(newComponent);
        newComponent->Init();
        return *newComponent;
    }

所以我将逐行描述我对这一点的理解,如果你们能指正我,我将非常高兴。

1- 创建一个带有 N 个参数的类型 T 的模板(这就是扩展运算符在这里的意思,对吧?它声明了一个可变参数模板?)

2- 声明一个函数AddComponent returns T 的引用并接收N 个对类型为TArgs (???) 的引用的引用(这部分让我很困惑)。

3- 以一种非常奇怪的方式声明指向新的 object 类型 T 的指针 T。对于初学者,我不明白为什么 newComponent 的实例化是用 () 来解决的,例如 newComponent() 而不是 T* newComponent = new Component(...)(说真的,这就是我能掌握的全部从这一行)

从第 4 行开始,代码对我来说非常简单,不需要任何解释。

据我所知,我的差距是无法理解:可变参数模板和函数、右值、左值和前向问题。那是对的吗?你们能给我指点有关这些主题的有用文章吗?我发现大多数 cpp 参考资料都非常正式,超出了我的理解范围。有趣的是,我可以毫无问题地阅读 C#、Java、Typescript 和 Javascript 文档,但是当涉及到 C++ 时,很难从文档中提取一些内容。我通常只是跳过形式到实际的示例代码,然后我自己在编译器上尝试以了解发生了什么。

我知道很多,请回答您认为有用的任何信息。

谢谢大家

template <typename T, typename... TArgs>
T& AddComponent(TArgs&&... args)

这是函数模板的声明AddComponentTTArgs 是模板参数,它们都必须是类型。 TArgs 是可变参数(可以包含 0 种或更多类型)。 function template 为每个 TTArgs 的唯一组合剔除函数,例如。 AddComponent<int,long,float> 可以是这样的功能。

TArgs&&... 被称为 forwarding references 因为模板声明中的 && 具有保留参数的值类别 (lvalue/rvalue) 的效果。

    T* newComponent(new T(std::forward<TArgs>(args)...));

这是一个局部变量 newComponent 的定义,类型为指向 T 且初始值为 new T(std::forward<TArgs>(args)...)

std::forward is a helper utility that works together with TArgs&& and when needed passes rvalue references through to the call. When browsing code you can ignore it and read new T(std::forward<TArgs>(args)...) as new T(args...). Now that is a variadic pack expansion语法;这里模板中的参数 args 只是传递给 new().

更多详情请参考您喜欢的C++ Book。我最喜欢的(几年前)是 Scott Meyers 的 Effective Modern C++(Scott 称转发引用 universal references,其余的是一本好书)。