数组类模板(上)------一种高效的使用
预备知识
模板参数可以是数值型参数(非类型参数)
template
<typename T, int N>
void func()
{
T a[N]; //使用模板参数定义局部数组
}
func<double, 10>();
数值型模板参数的限制
-变量不能作为模板参数(变量是不能在编译期就唯一确定的)
-浮点数不能作为模板参数(浮点数在计算机内部的表示是不精确的)
-类对象不能作为模板参数
........
本质:
模板参数是在编译阶段被处理的单元,因此,在编译阶段必须准确无误的唯一确定
#include <iostream>
#include <string>
using namespace std;
template
//<typename T, double N> //将此处的int 修改为double编译出错,因为double不能作为数值型参数的类型
<typename T ,int N>
void func()
{
T a[N] = {0};
for(int i=0; i<N; i++)
{
a[i] = i;
}
for(int i=0; i<N; i++)
{
cout << a[i] <<endl;
}
}
int main()
{
func<int,10>(); //编译通过,正常运行
// int a = 10;
// func<int ,a>() ; //编译出错,数值型参数你能是变量
return 0;
}
有趣的面试题
用你觉得最高效的方法求1+2+3+...+N的值
数值型模板参数编程实验
#include <iostream>
#include <string>
using namespace std;
template
<int N>
class Sum
{
public:
static const int VALUE = Sum<N-1>::VALUE + N;
};
//做一个特化
template
< >
class Sum<1>
{
public:
static const int VALUE = 1;
};
int main()
{
cout << "1+2+3+...+10" << "=" << Sum<10>::VALUE <<endl; //在这里没有加减乘除法,也没有函数调用,也没有循环,这个地方的VALUE是一个常量,这个常量值在编译的时候就已经确定了。因此在这里仅仅是访问一个常量的值,
//这个地方n为10,编译器就通过上面的类模板来推导VALUE的值,当计算到n为1时,就用下面的完全特化实现。相加求和是在编译程序的时候得到的,在程序运行时直接取得该值即可。
//依赖的技术有:类模板技术、类模板的完全特化技术、数值型参数的模板技术
cout << "1+2+3+...+100" << "=" << Sum<100>::VALUE <<endl;
return 0;
}