-
Templates can have template parameters that are values rather than types.
-
You cannot use floating-point numbers, class-type objects, and objects with internal linkage (such as string literals) as arguments for nontype template parameters.
1 template <typename T, int VAL>
2 T addValue (T const& x)
3 {
4 return x + VAL;
5 }
1 std::transform (source.begin(), source.end(),
2 dest.begin(),
3 (int(*)(int const&)) addValue<int,5>);
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
stack4.hpp
1 #include <stdexcept>
2
3 template<typename T, int MAXSIZE>
4 class Stack
5 {
6 private:
7 T elems[MAXSIZE];
8 int numElems;
9 public:
10 Stack();
11 void push(const T&);
12 void pop();
13 const T top();
14 const bool empty()
15 {
16 return numElems == 0;
17 }
18 const bool full()
19 {
20 return numElems == MAXSIZE;
21 }
22 };
23
24 template<typename T, int MAXSIZE>
25 Stack<T, MAXSIZE>::Stack() : numElems(0)
26 {
27
28 }
29
30 template<typename T, int MAXSIZE>
31 void Stack<T, MAXSIZE>::push(const T& elem)
32 {
33 if(numElems == MAXSIZE)
34 {
35 throw out_of_range("Stack<>::push(): stack is full");
36 }
37 elems[numElems] = elem;
38 ++numElems;
39 }
40
41 template<typename T, int MAXSIZE>
42 void Stack<T, MAXSIZE>::pop()
43 {
44 if(numElems <= 0)
45 {
46 throw out_of_range("Stack<>::pop(): empty stack");
47 }
48 --numElems;
49 }
50
51 template<typename T, int MAXSIZE>
52 const T Stack<T, MAXSIZE>::top()
53 {
54 if(numElems <= 0)
55 {
56 throw out_of_range("Stack<>::top(): empty stack");
57 }
58 return elems[numElems-1];
59 }
60
61
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
stack4test.cpp
1 #include <iostream>
2 #include <string>
3 #include <cstdlib>
4 #include "stack4.hpp"
5 using namespace std;
6
7 int main()
8 {
9 try
10 {
11 Stack<int, 20> int20Stack;
12 Stack<int, 40> int40Stack;
13 Stack<string, 40> stringStack;
14
15 int20Stack.push(7);
16 cout << int20Stack.top() << endl;
17 //int20Stack.pop();
18
19 stringStack.push("hello");
20 cout << stringStack.top() << endl;
21 //stringStack.pop();
22 //stringStack.pop();
23
24 cin.get();
25 }
26 catch(const exception& ex)
27 {
28 cerr << "Exception: " << ex.what() << endl;
29 return EXIT_FAILURE;
30 }
31 }