zoukankan      html  css  js  c++  java
  • 【c++ templates读书笔记】【3】非类型模板参数

    对于函数模板和类模板,模板参数并不局限于类型,普通值也可以作为模板参数。但非类型模板参数是有限制的,只能是常整数(包括枚举值)或者指向外部链接对象的指针,浮点数、类对象和内部链接对象不允许作为非类型模板参数的。

    1、非类型类模板参数例子

    #include<iostream>
    using namespace std;
    //Maxsize是一个非类型模板参数
    template<typename T, int Maxsize>
    class Stack{
    private:
    	T elems[Maxsize];//包含元素的数组
    	int numOfElems;//当前元素个数
    public:
    	Stack();
    	void push(T const& elem);
    	void pop();
    	T top() const;
    	bool empty() const{
    		return numOfElems == 0;
    	}
    };
    template<typename T, int Maxsize>
    Stack<T, Maxsize>::Stack() :numOfElems(0){}
    
    template<typename T, int Maxsize>
    void Stack<T, Maxsize>::push(T const& elem){
    	elems[numOfElems] = elem;
    	++numOfElems;
    }
    template<typename T, int Maxsize>
    void Stack<T, Maxsize>::pop(){
    	if (numOfElems<=0){
    		throw out_of_range("Stack<>::pop():empty stack");
    	}
    	--numOfElems;
    }
    template<typename T, int Maxsize>
    T Stack<T, Maxsize>::top() const{
    	if (numOfElems==0){
    		throw out_of_range("Stack<>::pop():empty stack");
    	}
    	return elems[numOfElems-1];
    }
    
    int main(){
    	try{
    		Stack<int,20> istk;
    		istk.push(7);
    		istk.push(8);
    		istk.push(9);
    		cout << istk.top() << endl;
    		istk.pop();
    		cout << istk.top() << endl;
    	}catch (exception const& ex){
    		cerr << "Exception:" << ex.what() << endl;
    		return EXIT_FAILURE;
    	}
    
    	system("pause");
    	return 0;
    }

    2、非类型函数模板参数例子

    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    
    template<typename T=int,int Val>
    T addValue(T const& x){
    	return x + Val;
    }
    
    int main(){
    	vector<int> vec{ 1, 2, 3, 4, 5, 6, 7, 8 };
    	transform(vec.begin(), vec.end(), vec.begin(), (int(*)(int const&))addValue<int, 5>);
    
    	for (auto const& c : vec)
    		cout << c << " ";//6 7 8 9 10 11 12 13
    	cout << endl;
    
    	system("pause");
    	return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    MYSQL批量插入数据库实现语句性能分析【转】 批量插入!程序里面对于数据库插入的功能尽量用【异步处理+批量插入+(事务)】
    移动端如何解决页面返回上次浏览位置问题
    php对接java接口
    php后端遇到的问题
    jquery 判断字符串长度
    phpExcel常用方法详解
    html 手机端适配不同手机高度 ,把内容居中显示
    html 手机端 生成海报
    没错,老师就是个勤奋负责有良心的职业,不,的人
    睡眠是自然的第二道菜
  • 原文地址:https://www.cnblogs.com/ruan875417/p/4921346.html
Copyright © 2011-2022 走看看