Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.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

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++考试,这个课程的内容非常糟糕。我基本上要自学所有的东西,所以请容忍我在这里_C++_Templates - Fatal编程技术网

C++;编译器如何处理模板 正如你们中的一些人可能从我最近的帖子中了解到的,我正在学习一个C++考试,这个课程的内容非常糟糕。我基本上要自学所有的东西,所以请容忍我在这里

C++;编译器如何处理模板 正如你们中的一些人可能从我最近的帖子中了解到的,我正在学习一个C++考试,这个课程的内容非常糟糕。我基本上要自学所有的东西,所以请容忍我在这里,c++,templates,C++,Templates,这是一道试题: (i)解释C++语言中定义的模板概念。 一定要区分程序员的工作和用户的工作 编译器会 我目前的理由是: (i) 模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编程X功能,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的部分 我的问题是我不知道编译器如何处理模板的使用 我不确定编译器在这个阶段做了什么,如果有人能澄清这一点,这将是有帮助的。对于您创建的不同类型对象的每个实例,或者对于您使用的不同类型参数的函数,编译器只是在编译时生成一个重载版本。

这是一道试题:


(i)解释C++语言中定义的模板概念。 一定要区分程序员的工作和用户的工作 编译器会

我目前的理由是:

(i) 模板允许函数或类使用泛型进行操作。这允许程序员一次有效地编程X功能,并且能够将此功能用于许多不同的数据类型,而无需多次重写应用程序或应用程序的部分

我的问题是我不知道编译器如何处理模板的使用


我不确定编译器在这个阶段做了什么,如果有人能澄清这一点,这将是有帮助的。

对于您创建的不同类型对象的每个实例,或者对于您使用的不同类型参数的函数,编译器只是在编译时生成一个重载版本。因此,如果您有一个类似于排序函数的模板函数,并将该函数用于int和double数组,那么编译器实际上已经生成了两个函数:一个使用int,另一个使用double。这是我能给出的最简单的解释。希望有用

假设您使用模板编写函数:

template <typename T>
void function(T t){
 doSomething();
}
模板
空洞函数(T){
doSomething();
}
对于调用此函数的每个数据类型,编译器只需将“T”替换为该数据类型,比如说“int”,并为此生成代码,就像您从一开始就用“int”而不是“T”编写此函数一样。
如果其他人同意,这可能是正确的(但不是完全)的答案。C++中的模板< > P>模板是通过替换实现的。它不像Java泛型,它只是对涉及泛型类的代码进行类型检查,然后使用原始引用(类型擦除)对其进行编译

<>基本上C++为代码中使用的每个实际模板参数创建了一个不同的类/方法。如果你有你的

template<typename T>
void myMethod(T t)
{
  //
}
模板
无效方法(T)
{
//
}
编译时发生的事情是,为模板实际使用的每种类型编译不同的方法。如果您在
myMethod(50)
myMethod(“foo”)
上使用它,那么该方法的两个重载版本将在运行时可用。直观地说,这意味着模板可能会产生代码膨胀,但实际上,如果没有可读性较低的模板,则通过更大的代码库可以获得相同的表达能力,因此这不是真正的问题


所以后面没有黑魔力(好的,如果你考虑元编程或部分特化)。

解释模板的概念——DAT-PUN。你有多少个月来回答这个问题?这是一个相当宽泛的问题。问问自己“我将如何处理它”——编译器没有太大的不同。实现可能会有所不同——对于实际实现,标准不是很严格。请记住C++是静态类型和编译语言——这对模板施加了一些限制。编译器不会生成专门化,除非您要求它生成专门化并提供所需的每个“接口”。您需要知道编译器需要完成什么,但不知道它实际上是如何完成的。他们不是一回事,我想我理解你。基本上,编译器将覆盖可能存在的函数的所有可能变体,因此它可以有效地处理传递给函数的任何泛型。@chrisedwards否,编译器将为存在的每个变体生成新代码。不要在模板中使用“泛型”这个词。它们是完全不同的东西。是的。尝试使一个简单的函数,如
bool变大(t1,t2){return t1>t2
并简单地传递一个您自己的类,该类不处理运算符>。您将看到编译器生成的错误,然后您将完全理解编译器只是使用类型T生成重载版本。当然,不是所有可能的变体,只是使用的变体。不是p这是一个非常全面的示例,考虑到您甚至没有使用参数,也没有演示模板如何要求t实现某些“接口”@ddriver你是对的,但是理解这个概念就足够了。考虑到大多数编译器在模板出错时会抛出的那种随机垃圾,我认为他会很乐意暗示捕获。简单是好的,但捕获至少必须提到,不需要详细说明。