一、模板函数实例化
#include<iostream>
#include<string>
using namespace std::string_literals;
//函数模板定义
template<typename T>
T max(T x, T y)
{
return (x > y ? x : y);
}
//显式实例化:证书
template<int > int max(int, int);
int main()
{
//调用显式实例化的函数
std::cout << "max(1,2) : " << max(1, 2) << std::endl;
//浮点数实例化
std::cout << "max(2.9,1.0): " << max(2.9, 1.0) << std::endl;
//字符实例化
std::cout << "max('A','D'): " << max('A', 'D') << std::endl;
//字符串字面量实例化
std::cout << R"(max("ABC","ABD") : )" << max("ABC", "ABD") << std::endl;
std::cout << R"(max("124","123") :)" << max("124", "123") << std::endl;
//std::string 类型实例化
// std::cout << R"(max("ABC"s,"ABD"s) )" << max("ABC"s,"ABD"s) << std::endl;
// std::cout << R"(max("ABD"s,"ABC"s) )" << max("ABD"s, "ABC"s) << std::endl;
//名字空间冲突问题
}
结果如上图所示。
二、默认类型与非类型参数
#include"Stack.h"
#include<iostream>
#include<string>
int main()
{
Stack<> c;
std::string s{ "Hello,World!" };
for (auto i : s)
{
c.push(i);
}
for (; c.empty() != true;)
{
std::cout << c.pop();
}
}
结果如上图所示。
相关文件
#pragma once
template<typename T=char,int N=100>
class Stack
{
private:
T elements[N];
int size{ 0 };
public:
bool empty();
T peek();
T push(T value);
T pop();
int getSize();
Stack();
};
template<typename T,int N>
Stack<T,N>::Stack()
{
size = 0;
for (auto& i : elements)
{
i = 0;
}
}
template<typename T, int N>
bool Stack<T, N>::empty()
{
return (size == 0 ? true : false);
}
template<typename T, int N>
int Stack<T, N>::getSize()
{
return size;
}
template<typename T, int N>
T Stack<T, N>::peek()
{
return elements[size - 1];
}
template<typename T, int N>
T Stack<T, N>::pop()
{
T temp = elements[size - 1];
elements[size - 1] = 0;
size--;
return temp;
}
template<typename T, int N>
T Stack<T, N>::push(T value)
{
elements[size] = value;
size++;
return value;
}