C ++中模板的原理是什么?

时间:2010-09-07 06:52:54

标签: c++ templates

哪个模板库应该是新手初学者?

不确定操作系统是否重要,如果重要的话,我正在谈论Windows。

4 个答案:

答案 0 :(得分:5)

模板都是关于通用编程的。这个概念就像:你定义一个函数体/类,它可以处理任何类型的数据(具有一些属性,比如定义的特定运算符)。考虑您正在编写一个函数,它将返回给定参数的总和:

int sum(int a, int b)
{
    return a + b;
}

现在您希望该函数也适用于字符串。但你不能做到以下几点:

std::string s1 = "abc", s2 = "def";
std::string s = sum(s1, s2);

对于此sum()来电,您需要定义另一版本的sum()。模板将保存您的工作。只需按以下方式编写sum()的定义:

template<typename T>
T sum(const T& a, const T& b)
{
    return a + b;
}

现在,函数sum()适用于定义了operator+的任何数据类型。

修改

如果您想成为C ++程序员,首先需要学习STL (Standard Template Library)

答案 1 :(得分:3)

对于初学者来说,最好从良好的book开始。标准库(通常也称为STL)是您应该从中开始的模板库。

答案 2 :(得分:2)

模板是核心C ++语言的一个特性,由所有C ++编译器实现。您可以在不使用任何库的情况下编写模板。这只意味着你必须提供所有的模板代码;编译器会根据需要将该代码转换为适当的程序集。

核心理念behing模板是通用代码的概念。对于链接的整数列表,您需要的代码看起来与链接的字符串列表的代码相同;对于一个整数数组,几乎与一个字符串数组相同。模板允许您编写T个对象的链接列表,而无需预先指定T。然后,当您需要一个整数的链接列表时,您只需告诉编译器实例化该链接列表T==int

现在,链表很常见。因此,您不必编写链表模板;标准库(包含在每个编译器中)包含std::list<T>模板。要使用它,只需告诉编译器您需要哪种列表。 std::list<float>std::list<std::string>,等等。除了这样的容器类,还有算法。这些也是模板 - std::sort< >可以对许多不同的容器进行排序。与C中的qsort不同,C ++编译器知道它的排序方式,这使得std::sort< >更快。

ATL是一个微软库。它使用模板的原因与标准库相同 - 本身并不是目标,而是因为它允许Microsoft编写代码,然后您可以根据自己的特定需求进行定制。例如,有数千个COM接口。 ATL不需要为每个COM接口提供不同的代码;相反,它提供了一些模板,这些模板是为您想要使用的每个COM交互提供的。

答案 3 :(得分:0)

原则?我不得不说,它主要归结为不是“重新发明轮子”和快速应用程序开发(RAD),通过创建通用代码,只需通过更新模板参数就可以在不同情况下重用。一个很好的例子是std::liststd::vector

至于使用什么,这取决于你的目标(即:你正在制作什么类型或者pragram,它需要做什么?),通常你可以使用boost和/或目前大多数编译器都附带的STL库