目录

1. 模板是什么?

2.为什么需要模板

3.模板怎么用


和泛型搭配一起看

C++ Primer - 模板与泛型编程

你所不知道的 template

1. 模板是什么?

模板=函数模板+类模板

C++函数模板(Function Template)

C++类模板(Class Template)

值的参数化。         在C++中,数据的类型也可以通过参数来传递,在函数定义时可以不指明具体的数据类型,当发生函数调用时,编译器可以根据传入的实参自动推断数据类型。这就是类型的参数化。         值(Value)和类型(Type)是数据的两个主要特征,它们在C++中都可以被参数化。         所谓函数模板,实际上是建立一个通用函数,它所用到的数据的类型(包括返回值类型、形参类型、局部变量类型)可以不具体指定,而是用一个虚拟的类型来代替(实际上是用一个标识符来占位),等发生函数调用时再根据传入的实参来逆推出真正的类型。这个通用函数就称为函数模板(Function Template)。         在函数模板中,数据的值和类型都被参数化了,发生函数调用时编译器会根据传入的实参来推演形参的值和类型。换个角度说,函数模板除了支持值的参数化,还支持类型的参数化。         一但定义了函数模板,就可以将类型参数用于函数定义和函数声明了。说得直白一点,原来使用 int、float、char 等内置类型的地方,都可以用类型参数来代替。

Generics With C++

Templates模板

        C++ implements generic programming concepts through templates. Templates give the compiler a framework to generate code for the types it gets implemented with. With a class, C++ will look at your template as well as the type specified when you created the object, and generate that typed class for you.

        C + + 通过模板实现了泛型的概念。模板为编译器提供了一个框架,用于为其实现的类型生成代码。对于类,c + + 将查看您的模板以及在创建对象时指定的类型,并为您生成类型化类。

        Think of it as a cookie cutter in the shape of a star. You can have various kinds of cookie dough, like shortbread, or chocolate-shortbread or chocolate chip cookie dough. The cookie cutter doesn’t care about the ingredients, as long as it is dough.

        可以把它想象成一个星形的饼干切割机。你可以有各种各样的曲奇面团,比如脆饼,或巧克力脆饼或巧克力片曲奇面团。只要是面团,饼干切割机就不会在意配料。

Generics in C++

        Generics can be implemented in C++ using Templates. Template is a simple and yet very powerful tool in C++. The simple idea is to pass data type as a parameter so that we don’t need to write the same code for different data types. For example, a software company may need sort() for different data types. Rather than writing and maintaining the multiple codes, we can write one sort() and pass data type as a parameter.

简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码。例如,软件公司可能需要 sort ()来处理不同的数据类型。与编写和维护多个代码不同,我们可以编写一个 sort ()并将数据类型作为参数传递。

C++ Templates

        Templates are the foundation of generic programming, which involves writing code in a way that is independent of any particular type.

        模板是泛型的基础,它包括以独立于任何特定类型的方式编写代码。

        A template is a blueprint or formula for creating a generic class or a function. The library containers like iterators and algorithms are examples of generic programming and have been developed using template concept.

        模板是用于创建泛型类或函数的蓝图或公式。像迭代器和算法这样的库容器就是泛型的例子,并且是用模板概念开发的。

        There is a single definition of each container, such as vector, but we can define many different kinds of vectors for example, vector <int> or vector <string>.

        每个容器都有一个单一的定义,例如 vector,但是我们可以定义许多不同类型的向量,例如 vector < int > 或 vector < string > 。

2.为什么需要模板

C++ Primer - 模板与泛型编程

不用模板:

        设计程序时往往希望同一个函数可以处理多种不同类型的参数,由于类型转换可能会引起各种各样的问题,我们需要对每一种所需的类型都重载一个几乎相同的函数。

int compare(const string &v1, const string &v2)
{
    if(v1 < v2) return -1;
    if(v2 < v1) return 1;
    return 0;
}
int compare(const double &v1, const double &v2)
{
    if(v1 < v2) return -1;
    if(v2 < v1) return 1;
    return 0;
}

用模板:

template <typename T>
int compare(const T &v1, const T &v2)
{
    if(v1 < v2) return -1;
    if(v2 < v1) return 1;
    return 0;
}

为什么需要模板

不用模板:

假定我们有很多个类型需要去实现相似的功能,比如,我们要实现不同类型的链表

不用模板的话大致有这样几种方法

  1. 枚举所有类型
  2. 使用void*

囿于篇幅只介绍一种利用宏来实现的,当然这种还是不建议使用

#define GetType(Type) Item##Type
#define Generate(Type)          \
struct GetType(Type) {          \   
    Type value;                 \
    struct GetType(Type) * next;\
}

Generate(int);
Generate(double);

int main() 
{
    GetType(int) il;
    il.value = 8;
    il.next = nullptr;  
    return 0;
}

用模板:

template <typename Type>
struct Item
{
    Type value;
    Item *next;
};
template <typename Type>
class List
{
public:
    ....
private:
    Item<Type> head_;
};
int main()
{
    List<int> il;
    List<double> dl;
    return 0;
}

3.模板怎么用

C++函数模板(Function Template)

C++类模板(Class Template)

C++中模板使用详解