C++ Templates之函数模板

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26822029/article/details/81069247

在《C++ Templates》书中有这样的代码片段:

#include <iostream>
using namespace std;

template <typename T>
inline T const &max(T const &a, T const &b)
{
	return a > b ? a : b;
}

int main()
{
	int result = ::max(5, 7);
	cout<<result;
	return 0;
}

    这是函数模板的基本形态,和后面的类模板有几分相似。关键字typename也可用class替代,但是不推荐(因为可能和类的class搞混)。 函数模板还是比较好理解的,不过针对上面的代码需别解释以下几个问题:

  1. 代码第5行为什么要用inline?
  2. 代码第5行返回值为什么要为const?
  3. 代码第5行返回值为什么要引用?
  4. 代码第12行为什么要用::max()这种写法?

解释:

  1. 因为max函数体只有一行,如果不适用内联函数的话,在调用这个函数时入栈等操作的空间开销相比于使用内联关键字将代码直接展开的开销更大,因此使用inline关键字。
  2. 因为返回值只能是a或者b,而a和b均是const的,不能直接把const的变量转变为非const的。因此返回值要用const修饰。如果代码这样改:
template <typename T>
inline T &max(T const &a, T const &b)
{
	return a > b ? a : b;
}

        在编译的时候会报错:

    3.这里返回值也采用引用的方式,和形参引用是一样的道理,能够减少数值传递过程中的时间。 不采用引用也能够正常运行,不过在代码优化方面考虑添加引用的效果更好。

    4.在max函数前面加::是为了确保我们调用的是全局名字空间中的max函数。 因为在标准库中也有一个std::max()模板,若是不加命名空间的限制,在编译期间会产生二义性,编译器会报错。

猜你喜欢

转载自blog.csdn.net/qq_26822029/article/details/81069247