C++之函数模板(一)

C++是一门非常强大,非常复杂,非常庞大的语言。C++本身从C语言发展而来,它一开始就具备了面向过程编程和面向对象编程这两种编程范式(编程风格,其实就是程序设计的不同哲学理念)。后来随着C++的逐步发展,它支持了泛型编程。本文将要介绍的函数模板就是泛型编程的程序设计理念。再后来C++有了模板元编程,这本质上就是函数式编程。在C++11标准中又引进了lambda表达式。到此为止,C++已经变得非常复杂,非常庞大,同时也非常强大。我不太了解函数式编程的设计理念是什么。从百度百科的介绍来看,应该是函数作为程序设计的第一位。C++本身并不提倡使用函数式编程风格。

C++是一门古老而又年轻的语言,它一直在随着时代不断变化,充满着活力。

函数模板

函数模板是想实现数据类型的模糊,使得多种数据类型都支持的某种操作用一个函数来实现,从而实现代码的复用,泛用。这就是泛型编程的设计理念。泛型编程能大大帮助我们偷懒,大家都想少写一些代码,实现的功能却没有变少。

大家都写过交换两个变量的函数,它们可能长成下面这个样子。

void swap(int& a, int& b)			//交换两个int变量
{
	if (a != b)
	{
		a = a ^ b;
		b = a ^ b;
		a = a ^ b;
	}
}

void swap(double& a, double& b)		//交换两个double变量
{
	if (a != b)
	{
		a = a + b;
		b = a - b;
		a = a - b;
	}
}

void swap(char& a, char& b)			//交换两个字符
{
	char c = a;
	a = b;
	b = c;
}

虽然都是交换,但是由于数据类型的不同,我们只能写三个重载函数来实现交换。大家都想偷个懒,少写点。也就有了泛型编程设计理念。

函数模板就是实现泛型编程设计理念的工具之一。函数模板能大大提高代码的复用性。

函数模板的形式如下:

template<typename 模板名1,...,typename 模板名n>
函数返回值 函数名 (模板名1   a,...,模板名n   n)
{
	函数体
} 
  • 其中typename这个关键字可以使用class这个关键字来替换。

  • 函数模板只对紧跟其后的第一个函数作用。

  • 模板名1和模板名2在函数被调用后都表示一个具体的数据类型。

  • 需要用到几种类型,就声明几个模板名。

  • 泛型也运用了一种多态的方式(静态多态)。

交换两个变量,首先这两个变量肯定是相同类型的,因此我们只需要一个模板名就够了。所以被实现的通用代码如下:

template<typename T>
void swap(T a, T b)
{
	T tmp = a;
	b = a;
	a = tmp;
}

一般这样的简单的函数,我们还会将其声明为内联函数。如下:

template<typename T>
inline void swap(T a, T b)
{
	T tmp = a;
	b = a;
	a = tmp;
}

这样就大大简化了代码。

关于调用函数模板,这和普通的函数调用稍有不同。我们可以显式调用,也可以让它进行自动类型推导。这个自动类型在复杂类型的时候不太好用。因此一般我们都是使用显示类型调用。如下所示:

swap<char>(a, b);			//显式调用
swap(i, j);				//自动类型推导
swap(x, y);				//自动类型推导

 

 

 

发布了222 篇原创文章 · 获赞 174 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/zy010101/article/details/105298862