今日学习笔记

今天起的很晚。
以下为今天的学习笔记,以后只要没有琐事会天天发的。

.hpp是什么, 怎么用:
为c++的头文件,c++允许在.hpp文件中编写函数体的声明和实现代码。在调用函数时只需要包含其头文件即可。

pragma once

保证程序的不重复编译

模板类的静态成员
模板类中的静态成员变量声明了不同的函数实体将产生不同的静态成员变量。
模板参数:

整形模板参数:
    准确的说是整形常量
    #include <iostream>
    #include <stdexcept>
    using namespace std;
    template<typename T, unsigned size>
    class array
    {
        T elems[size];
        public:
        T& operator[](unsigned i) throw (std::out_of_range) {
        if(i >= size) throw std::out_of_range("array access out of range.");
        else return elems[i];
        }
    };
    int main(void)
    {
        array<int, 10> array0;
        try{array0[11] = 0;}
        catch(std::out_of_range& e)
        {
        cerr<<"Access out of range."<<endl;
        }
        return 0;
    }

函数指针模板参数:
    使用了模板技术实现了类似回调的“静态回调”
    #include <iostream>

    template<typename T , void (*f)(T& v)>
    void foreach(T array[], unsigned size)
    {
        for(unsigned i=0; i<size; i++) f(array[i]);
    }
    template<typename T>
    void inc(T &v)
    {
        ++v;
    }
    template<typename T>
    void dec(T &v)
    {
        --v;
    }
    template<typename T>
    void print(T &v)
    {
        std::cout<<" "<<v<<std::endl;
    }
    int main(void)
    {
        int array[] = {1, 2, 3, 4};
        foreach<int, inc<int> >(array, 4);
        foreach<int, print<int> >(array, 4);
        return 0;
    }
指针引用模板参数:
    指针和引用都要声明成全局变量
    #include <iostream>
    using namespace std;
    template<int *p>
    struct wrapper
    {
       int get(){return *p;}
       void set(int v){*p = v;} 
    };

    int global_variable = 0;
    int main(void)
    {
        wrapper<&global_variable> gwrapper;
        gwrapper.set(1);
        cout<<gwrapper.get()<<endl;
        
        return 0;
    }

类成员函数指针模板参数:
    #include <iostream>
    using namespace std;
    class some_value;
    typedef int (some_value::* some_value_mfp)(int);
    template<some_value_mfp func>
    int call(some_value &value, int op){return (value.*func)(op);}
    class some_value{
        int value ;
        public:
        some_value(int _value):value(_value){}
        int add_by(int op){return value += op;}
    };
    int main(void)
    {
        some_value v0(0);
        cout<<call<&some_value::add_by>(v0, 2)<<endl;
        return 0;
    }
模板型模板参数:
    #include <iostream>
    using namespace std;
    template<template<typename TT> class Func, typename T>
    void foreach(T array[], unsigned size)
    {
        Func<T> func;
        for(unsigned i=0; i<size; ++i) func(array[i]);
    }
    template<typename T>
    struct inc
    {
        void operator()(T& v) const {v++;}   
    };
    template<typename T>
    struct print
    {
        void operator()(T& v) const {cout<<" "<<v;}
    };
    int main(void)
    {
        int array[] = {1,2,3,4,5,6};
        foreach<inc, int>(array, 6);
        foreach<print, int>(array, 6);
        return 0;
    }

异常:超出范围的值抛出的:<stdexcept>头文件下的 std::out_of_rang

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第一天 一.内联函数(inline) 函数调用的时候需要建立栈内存环境,进行参数传递,并产生程序执行转移,这些工作...
    陈果123阅读 1,145评论 0 1
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,537评论 1 51
  • 重新系统学习下C++;但是还是少了好多知识点;socket;unix;stl;boost等; C++ 教程 | 菜...
    kakukeme阅读 20,030评论 0 50
  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,880评论 0 27
  • 第一章 计算机与C++编程简介 C++程序6个阶段编程 ->预处理->编译->连接->装入->执行1.程序在编译器...
    rogertan30阅读 4,075评论 0 1