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


    预备知识
    模板参数可以是数值型参数(非类型参数)
    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; }
  • 相关阅读:
    laravel生命周期
    工厂模式
    PHP保留两位小数的几种方法
    存储单位转换
    防盗链之URL参数签名
    redis基础
    Redis 如何实现持久化
    Python高级语法-私有属性-with上下文管理器(4.7.3)
    Python高级语法-私有属性-魔法属性(4.7.2)
    Python高级语法-私有属性-名字重整(4.7.1)
  • 原文地址:https://www.cnblogs.com/-glb/p/12000088.html
Copyright © 2020-2023  润新知