gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:18:11 24 4
gpt4 key购买 nike

我知道标题很烂,只是我不太确定该怎么问,因为我缺乏许多基本的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,该函数返回T的引用并接收TArgs(???)类型的引用的N个引用(这部分确实让我感到困惑)。

3-以一种非常奇怪的方式声明一个指向类型T的新对象的指针T。对于初学者来说,我不明白为什么 newComponent的实例化是通过 ()(例如 newComponent())而不是 T* newComponent = new Component(...)来解决的(严重的是,我可以从这一行中掌握所有内容)

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

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

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

谢谢你们

最佳答案

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

那是函数模板 AddComponent的声明。 TTArgs是模板参数,两者都必须是类型。 TArgs是一个可变参数(可以容纳0个或更多类型)。例如, function template会为 TTArgs的每个唯一组合淘汰函数。 AddComponent<int,long,float>可能是这样的功能。
TArgs&&...之所以称为 forwarding references,是因为模板声明中的 &&具有保留参数的值类别(左值/右值)的作用。
    T* newComponent(new T(std::forward<TArgs>(args)...));

这是指针类型为 newComponent和初始值为 T的局部变量 new T(std::forward<TArgs>(args)...)的定义。

std::forward 是一个辅助程序实用程序,可与 TArgs&&一起使用,并在需要时将右值引用传递给调用。浏览代码时,可以忽略它,并将 new T(std::forward<TArgs>(args)...)读为 new T(args...)。现在这是一个可变的 pack expansion语法;这里,模板中的参数 args只是传递给 new()

有关更多详细信息,请参阅您喜欢的 C++ Book。我最喜欢的(几年前)是Scott Meyers撰写的Effective Modern C++(Scott称转发引用为通用引用,其余都是一本好书)。

关于c++ - 有人可以帮我启发这个模板吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234704/

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