c++基础(模板)

作者: zidea | 来源:发表于2019-05-02 06:39 被阅读3次
Cplusplus-tutorial-in-hindi.jpg

可能会将 c++ 中模板和 java 或 c# 中的泛型来作比较,不过 c++ 中模板是具有无限力量,功能远远超出 java 和 c# 中的泛型。要是想深入了解模板,需要下一番功夫。有的开发人员可以写出强大且复杂的模板。

那么什么是模板,有点类似我们了解元编程,就是让代码生成代码。c++ 编译器会根据定义好的模板规则在编译期间为您生成代码。这就是模板的定义也是模板的作用。

#include <iostream>

void Print(int val)
{
    std::cout << val << std::endl;
}

int main(int argc, char const *argv[])
{

    Print(5);
    std::cin.get();
}

这里简单写了输出的函数,接收int作为参数进行输出。

int main(int argc, char const *argv[])
{

    Print(5);
    Print("hello");
    std::cin.get();
}

如果想要我们的Print也支持对字符串输出,我们就需要重载一下这个函数void Print(std::string val)

void Print(std::string val)
{
    std::cout << val << std::endl;
}

通过重载多次```Print()````,可以让函数接收更多类型参数进行输出。这样做当然没有问题,很多人也喜欢这样做。现在我们通过模板来重构我们代码让他看起来更简单易懂些。

template <typename T>
void Print(T val)
{
    std::cout << val << std::endl;
}

int main(int argc, char const *argv[])
{

    Print(5);
    Print("hello");
    Print(5.0f);
    std::cin.get();
}

使用模板定义一个类型 T 作为泛型,其实 T 是类型变量,根据我们传入类型而定。这样代码看起来清晰易懂。

  • template 这个关键字告诉编译器这是个模板需要在编译期间进行处理
  • 模板参数是typename T 告诉编译器这是 typename 而 T 是其名称可以为任意名称,这里是一种习惯,习惯将其命名为 T。
  • 这里编译器根据传值进行类型推断对 T 进行赋值,我们也可以显式地对 T 进行赋值。
Print<int>(5);

其实模板背后工作是根据我们传入类型实际创建出一个一个接收不同类型作为参数Print()函数。

#include <iostream>
#include <string>

template <int N>
class Array
{
  private:
    int m_Array[N];

  public:
    int getSize() const { return N; }
};

int main(int argc, char const *argv[])
{

    Array<5> array;
    std::cout << array.getSize() << std::endl;
    std::cin.get();
}

在这个例子中给出模板更多的功能,通过模板我们实现一个可以在编译期间指定大小数组类。在编译期间会根据模板的 N 的值生成对应代码。

class Array
{
  private:
    int m_Array[5];

  public:
    int getSize() const { return 5; }
};

我们可以追加指定 T 表示类型,来让 Array 变得更加灵活。

template <typename T, int N>
class Array
{
  private:
    T m_Array[N];

  public:
    int getSize() const { return N; }
};
Array<int, 5> array;

当然模板不仅这些,我们可以写出复杂到难以理解模板,不过个人推荐不要痴狂于模板,将模板用到恰到好处即可。过渡使用可能适得其反。

相关文章

  • C++模板类型推导

    模板是C++的重要特性,是C++标准模板库的基础。模板可以根据数据类型自动生成代码,大大减少重复代码。模板实例化的...

  • cpp模板

    总结下c++模板相关的基础知识,便于查阅。 模板: 模板定义以关键字template开始,后跟一个模板参数列表,这...

  • c++基础(模板)

    可能会将 c++ 中模板和 java 或 c# 中的泛型来作比较,不过 c++ 中模板是具有无限力量,功能远远超出...

  • 模板特化

    模板是C++泛型编程编程的基础,STL从头到尾都是模板泛型编程 函数模板 类模板 几个需要注意的点1. 类模板的和...

  • 第七周 C++标准库 体系结构与内核分析 Boolan 侯捷

    源码之前,了无秘密 你应具备的基础 C++ 基本语法 模板(Templates)基础令你事半功倍 数据结构(Dat...

  • C++ 学习(2) ---- 基本语法介绍

    C++ 基本语法(2) C++基础语法说明模板NA运算符重载NA强制类型转换static_cast,const_c...

  • C++基础-(模板及标准模板库)

    C++基础 模板及标准模板库 模板的作用模板使程序员能够快速的建立具有类型安全得库集合和函数集合,它的实现,方便了...

  • C++ Template (二):初步元编程

    前言   在上一篇博客C++ Template (一):模板基础中,简单介绍了模板的定义,实例化,特化以及参数包的...

  • Item 1Understand template type d

    引子 模板类型推导是Modern C++特性auto的基础,但模板类型推导和auto类型推导有一些区别,具体看正文...

  • Geekband C++ 第五周

    概述 C++模板简介 函数模板 C++类模板 操作符重载 泛型编程 容器

网友评论

    本文标题:c++基础(模板)

    本文链接:https://www.haomeiwen.com/subject/nzkinqtx.html