C++泛型编程1——函数模板实例化,模板参数,重载及特化

  在C++中我们都知道引入了函数重载,那么在实际应用过程中:
  如果我们想要实现一个加法函数,我们可以写出很简单的代码:
  

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

  上面的函数很简单,但是仔细想一下,这样就实现了加法操作嘛?当我们的实参类型为double,float时,又怎么处理加法呢?
  我们可以多定义几个函数
  

double ADD(double a,double b)
{
  return a+b;
}
float ADD(float a,float b)
{
  return a+b;
}

  上面的方式是可行的,但是在C++中的数据类型那么多,我们应该如何妥善处理这个问题呢?难道如此简单的加法函数就要写那么多代码?
  如何解决上面的问题呢?

定义公共基类

  这个方法是将所有的重载函数都定义在一个公共基类里面,当我们调用的时候,直接通过这个公共基类去调用即可。
  上面的方法仿佛解决了使用的问题,但是还是有很多缺点:
1、借助公共基类来编写通用代码,将失去类型检查的优点;
2、对于以后实现的许多类,都必须继承自某个特定的基类,代码维护更加困难。

使用宏替换

  那么下面的方法即使用宏替换
  

#define ADD(a,b) ((a)+(b))

  在C语言学习时我们就知道,宏定义虽然很方便,但是还是有很多坏处的。
- 宏是在预编译时展开的
- 宏只是简单的文本替换
- 宏不具有类型检测,语句是否正确等编译功能
- 宏在定义时容易出现宏参数二义性问题

泛型编程

  所以在C++中,引入了泛型编程的概念。
  泛型编程:编写与类型无关的逻辑代码,是代码复用的一种手段。模板是泛型编程的基础。

  其实面向对象编程OOP和把泛型编程都能处理在编写程序时不知道类型的情况。
  不同之处在于:
  OOP能处理类型在程序运行之前都未知的情况,而在泛型编程中,在编译时就能获知类型了。

模板

  模板是C++中泛型编程的基础,一个模板就是一个创建类或者函数的蓝图。

函数模板

  函数模板代表了一个函数家族,该函数与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
  函数模板是通用的函数描述,也就是说,他们使用通用类型来定义函数,其中的通用类型可用具体的类型替换。如int,double类型。
  通过将类型作为参数传递给模板,可使编译器生成该类型的函数,由于模板允许以通用类型的方式编写程序,因此也被称为通用编程。

函数模板的定义

  一个函数模板就是一个公式,可用来生成针对特定类型的函数版

你可能感兴趣的:(C/C++,面试,泛型编程,函数模板,特化,C++)