类模板使用示例(五) 非类型类模板参数

Stack4.hpp的代码如下:

#ifndef STACK4_HPP
#define STACK4_HPP

#include <iostream>
#include <vector>
#include <stdexcept>

template <typename T, int MAXSIZE>
class Stack
{
public:
    Stack();
    void push(T const&);
    void pop();
    T top() const;
    bool empty() const
    {
        return 0 == numElems;
    }

    bool full() const
    {
        return MAXSIZE == numElems;
    }
private:
    T elems[MAXSIZE];
    int numElems;
};

template <typename T, int MAXSIZE>
Stack<T, MAXSIZE>::Stack()
: numElems(0)
{

}

template <typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::push(T const& elem)
{
     if (full())
    {
        throw std::out_of_range("Stack<>::push(): stack is full");
    }

    elems[numElems] = elem;
    ++numElems;
}

template <typename T, int MAXSIZE>
void Stack<T, MAXSIZE>::pop()
{
    if (empty())
    {
        throw std::out_of_range("Stack<>::pop(): empty stack");
    }

    --numElems;
}

template <typename T, int MAXSIZE>
T Stack<T, MAXSIZE>::top() const
{
    if (empty())
    {
        throw std::out_of_range("Stack<>::top(): empty stack");
    }

    return elems[numElems-1];
}

#endif // STACK4_HPP

测试代码main.cpp:

#include <iostream>
#include <string>
#include <deque>
#include <cstdlib>
#include <typeinfo>
#include "Stack4.hpp"

using namespace std;

int main()
{
   try
    {
        Stack<int, 20> int20Stack;
        int20Stack.push(7);
        cout << int20Stack.top() << endl;
        int20Stack.pop();

        Stack<int, 40> int40Stack;

        cout << "\nThe type of int20Stack: " << typeid(int20Stack).name() << endl
             << "The type of int40Stack: " << typeid(int40Stack).name() << endl;

        Stack<string, 40> string40Stack;
        string40Stack.push("Hello");
        cout << endl << string40Stack.top() <<endl;
        string40Stack.pop();
        string40Stack.pop();
    }
    catch (std::exception const& ex)
    {
        cerr << "Exception: " << ex.what() << endl;
        return EXIT_FAILURE;// n stdlib.h
    }

    return 0;
}

结果:

时间: 2024-10-16 07:12:39

类模板使用示例(五) 非类型类模板参数的相关文章

java 虚方法。 后面new 那个类, 就调用哪个类的方法 ,而非定义类的方案。 关于父子 类的 呵呵

java   虚方法.     后面new  那个类, 就调用哪个类的方法 ,而非定义类的方案.  关于父子 类的   呵呵 在多态的情况下,声明为父类类型的引用变量只能调用父类中的方法,但如果此变量实际引用的是子类对象,而子类对象中覆盖了父类的方法,这时父类对象调用的是子类中的方法,这种机制就成为虚方法调用.所以,同样的两个引用变量调用相同的方法结果可能不同.

类模板使用示例(二)类模板整体特化

特化的目的: 表明该模板在特殊类型下具有不同的行为. 注意:特化的实现可以和基本类模板的实现完全不同. Stack2.h代码: #ifndef STACK2_H #define STACK2_H #include <deque> #include <string> #include <stdexcept> #include "TestCC.h" template<> class Stack<std::string> { pub

类模板使用示例(三) 类模板局部特化

MyClass.h文件代码: #ifndef MYCLASS_H #define MYCLASS_H #include<iostream> template <typename T1, typename T2> class MyClass { public: void print() { std::cout << "T1 VS. T2" << std::endl; } }; template <typename T> clas

非类型模板参数

对于函数模板与类模板,模板参数并不局限于类型,普通值也可以作为模板参数.在基于类型参数的模板中,你定义了一些具体的细节来加以确定代码,直到代码被调用时这些细节才被真正的确定.但是在这里,我们面对的是这些细节是值,而不是类型,当要使用基于值的模板时,必须显式地指定这些值,才能够对模板进行实例化. 非类型的类模板参数 创建类的头文件 #include<stdexcept> #include<iostream> using namespace std; template<typen

Haskell学习笔记一:类型和类型类相关内容

内容提要: 静态类型系统: 编译时确定类型错误: 类型推导机制: 基础类型:Int,Integer,Float,Double,Bool,Char: 类型变量: 基础类型类:Eq,Ord,Show,Read,Enum,Bounded,Num,Integral,Floating: Haskell是一门函数式编程语言,被称为最为纯粹的函数式编程语言.Haskell的类型系统非常强大,其中包含了很多有趣.抽象.某种程度上充满学术气息的特质. Haskell属于静态类型语言,这意味着: 每个值或者表达式,

C++ template —— 模板特化(五)

本篇讲解模板特化------------------------------------------------------------------------------------------------------------第12章 特化和重载------------------------------------------------------------------------------------------------------------前面几篇博客讲解了C++模板如何

C++入门经典-例9.1-函数模板,函数模板的作用,使用数组作为模板参数

1:函数模板不是一个实在的函数,因此编译器不能为其生成可执行的代码.定义函数模板只是一个对函数功能框架的描述,在具体执行时,将根据传递的实际参数决定其功能. 2:函数模板定义的一般形式如下: template <类型形式参数> 返回类型 函数名(形式参数表) { ...//函数实现 } 其中template为关键字,表示定义一个模板,尖括号"<>"中为模板参数,模板参数主要有两种,一种是模板类型参数,另一种是模板非类型参数.上述代码中定义的模板使用的是模板类型参

【C/C++学院】0825-类模板/final_override/类模板与普通类的派生类模板虚函数抽象模板类/类模板友元/位运算算法以及类声明/Rtti 实时类型检测/高级new创建/类以及函数包装器

类模板 类模板多个类型默认类型简单数组模板 #pragma once template <class T=int>//类模板可以有一个默认的值 class myArray { public: myArray(); ~myArray(); }; #include "myArray.h" template <class T=int>//每一个函数都需要加上一个默认的值 myArray<T>::myArray() //类模板成员函数在外部,需要加载类型初始

初识Haskell 五:自定义数据类型和类型类

对Discrete Mathematics Using a Computer的第一章Introduction to Haskell进行总结.环境Windows 自定义数据类型 data type definitions 形式如: data Colour = Red | Orange | Yellow | Green | Blue | Violet Colour type包含了Red Orange Yellow Green Blue Violet这些值,这些值是constructor,其开头字母要