数组类模板(上)------一种高效的使用

预备知识
模板参数可以是数值型参数(非类型参数)
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; }

 

posted @ 2019-12-06 23:06  一代枭雄  阅读(389)  评论(0编辑  收藏  举报