C++ 模板总结

C++ 模板

1、模板概念

模板是泛型编程的基础。所谓泛型编程就是编写与类型无关的逻辑代码,是一种复用的方式。

模板分为模板函数和模板类。

2、typename 与 class

    template <class T>    // 采用 class 来声明模板
  class {  
  };

    template <typename T> // 采用 typename 来声明模板
    class {
    };

这两种一般来说 typename 用于内置类型,而 class 来声明类。但是 typename 也可以用作声

明类,而 class 也可以用来声明内置类型。

区别:当 T 是一个类的时候,并且这个类又有子类,应该用 typename // 未懂!

3、特化

特化分为两种:

  • 全特化
    • 函数模板只能用作全特化
  • 偏特化
    • 类模板可以用作偏特化

模板的全特化与偏特化都是建立在已定义的模板基础之上,不能够单独存在。

4、模板的分离编译

// fun.h
template <class T>
void fun(const T&);

// fun.cpp
#include "fun.h"
template <class T>
void fun(const T& t) {
  std::cout << t << std::endl;
}

// main.cpp
#include <iostream>
#include  "fun.h"

int main()
{
    fun(3);

  return 0;
}

这个代码在进行链接的时候会出现问题。原因是在代码编译的时候,由于 fun.cpp 中的 fun函数中没有参数,在实例化时无法生成代码。所以链接时 main.cpp 调用 fun 时,找不到函数 fun (int)实现的代码,所以链接错误。

这里写图片描述

解决方式:

  • 将函数模板的定义放到头文件中

  • 显式实例化,在 fun.cpp 中显式实例化模板函数。

    template void fun<int> (const int&);

5、总结

优点:

  • 模板复用了代码,节省资源。
  • 增强了代码的灵活性。

缺点:

  • 模板让代码变得凌乱,不易维护,编译代码的时间变长。
  • 出错时错误信息十分凌乱,不容易定位。


    欢迎大家共同讨论,如有错误及时联系作者指出,并改正。谢谢大家!

猜你喜欢

转载自blog.csdn.net/liuchenxia8/article/details/81706357