Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有人能帮我解释一下这个模板吗? 我知道标题很糟糕,只是我不知道该怎么问,因为我缺少很多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]); } } void打印向量(常量T&vec、常量S&vec2){ 对于(int i=0;i”); 打印(vec2[i]); } }_C++_Templates_Variadic Templates - Fatal编程技术网

有人能帮我解释一下这个模板吗? 我知道标题很糟糕,只是我不知道该怎么问,因为我缺少很多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]); } } void打印向量(常量T&vec、常量S&vec2){ 对于(int i=0;i”); 打印(vec2[i]); } }

有人能帮我解释一下这个模板吗? 我知道标题很糟糕,只是我不知道该怎么问,因为我缺少很多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]); } } void打印向量(常量T&vec、常量S&vec2){ 对于(int i=0;i”); 打印(vec2[i]); } },c++,templates,variadic-templates,C++,Templates,Variadic Templates,现在,从SDL开始,我遇到了这样的事情: template <typename T, typename... TArgs> T& AddComponent(TArgs&&... args) { T* newComponent(new T(std::forward<TArgs>(args)...)); newComponent->componentName = typeid(T).name();

现在,从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;
    }
模板
T&Add组件(目标和参数){
T*newComponent(新T(std::forward(args)…);
NewcomComponent->componentName=typeid(T).name();
newComponent->owner=这个;
组件。回装(新组件);
newComponent->Init();
返回*新组件;
}
所以我要一行一行地描述我所理解的,如果你们能纠正我,我将非常高兴

1-创建一个具有N个参数的T型模板(这就是spread操作符在这里的意思,对吗?它声明了一个可变模板?)

2-声明一个函数
AddComponent
,该函数返回T的引用,并接收N个TArgs(??)类型的引用(这一部分让我很困惑)

3-以一种非常奇怪的方式声明指向T类型的新对象的指针T。首先,我不明白为什么要用
()
来处理
新组件的实例化,比如
新组件()
,而不是
t*newComponent=new Component(…)
(说真的,这是我从这一行所能理解的)

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

从我所能理解的,我的差距是无法理解:可变模板和函数,右值,左值和正向问题。对吗?你们能给我指一些关于这些主题的有用文章吗?我发现大多数cpp推荐信都非常正式,远远超出了我的能力范围。有趣的是,我可以阅读C++、java、Typescript和JavaScript文档,这毫无问题,但是当涉及到C++时,从文档中提取一些东西是非常困难的。我通常只是跳过了实际示例代码的形式,然后我自己在编译器上进行了尝试,以了解发生了什么

我知道这是很多,回答任何你认为有用的信息

谢谢各位

template <typename T, typename... TArgs>
T& AddComponent(TArgs&&... args)
这是指向-
T
类型的局部变量
newcommponent
和初始值
newt(std::forward(args)…
的定义

是一个助手实用程序,它与
targets&&
一起工作,并在需要时将右值引用传递给调用。浏览代码时,您可以忽略它,并将其作为
newt(args…)
读取。这是一种可变语法;这里,模板中的参数
args
被简单地传递到
new()


有关更多详细信息,请参阅您的收藏夹。我最喜欢的(几年前)是Scott Meyers的现代C++(史葛称为转发引用通用引用,其余的是一本好书)。< /p>这是否回答了<代码> STD::前进< /代码>?检查更多关于声明R值引用的信息(<代码> &和代码>),谢谢您花时间!现在一切都差不多清楚了!我仍然无法理解与指向t的指针关联的局部变量的声明。为什么我们要“调用”
newComponent
来定义它的初始值?这种语法只发生在模板内部吗?我不能在模板范围之外真正地复制它。这是直接初始化,C++中最古老的语法。代码>int i(5)是另一个例子。不推荐使用它,因为它可能导致臭名昭著的最烦人的解析。现代C++替代语法是“代码> int i { 5 };<代码>
    T* newComponent(new T(std::forward<TArgs>(args)...));