C++模板template用法详解
一.template基础用法:类模板与函数模板
1. 函数模板
template<typename T>
T max(const T& lhs, const T& rhs){
if (lhs > rhs)
return lhs;
else
return rhs;
}
void test0() {
int i1 = 3, i2 = 4;
cout << max(3, 4) << endl;
double d1 = 3.0, d2 = 4.0;
cout << max(d1, d2) << endl;
string s1 = "abcd", s2 = "bce";
cout << max(s1, s2) << endl;
}
2.类模板 实现Stack类模板编程
template<class T>
class Stack {
public:
Stack(){}
~Stack() {}
void push(const T&);
void pop();
T top();
private:
vector<T> elem;
};
template<class T>
void Stack<T>::push(const T& e) {
elem.push_back(e);
}
template<class T>
void Stack<T>::pop() {
if (elem.empty())
throw out_of_range("Stack is empty");
elem.pop_back();
}
template<class T>
T Stack<T>::top() {
//由于top必须要返回一个值,当stack为空时,应该返回的值就不确定了,所以应该直接抛出异常
if (elem.empty())
throw out_of_range("Stack is empty");
return elem.back();
}
void test1() {
try {
Stack<int> s1;
s1.push(1);
s1.push(2);
cout << s1.top() << endl;
Stack<string> s2;
s2.push("bat");
cout << s2.top() << endl;
s2.pop();
s2.pop();
}
catch (exception e) {
cout << "catch exception:" << e.what() << endl;
}
}
二.模板参数包 typename… Args
1.typename… Args
Args指代了不同类型的参数,表示有0,1个或者多个。
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <deque>
#include <list>
using std::list;
using std::deque;
using namespace std;
//1.输出参数的个数
template<typename... Args>
void display(Args... args){
cout << sizeof...(args) << endl;
}
//2.将所有的参数都用print函数输出
void print(){
}
template<typename T, typename... Args>
void print(T val, Args... args){//这里可以理解成每次取出一个元素,其余的仍然存放在args中
cout << val << endl;
print(args...);
}
//3.sum函数相加多个参数
int sum(){
return 0;
}
template<typename T, typename... Args>
int sum(T val, Args... args){
val += sum(args...);
return val;
}
int main()
{
//display(1,2,3,"132",'s');
//print(1,2,"123",'c');
cout << sum('a',2,3,4,5) << endl;
return 0;
}
小程序实现:typename…实现printf函数
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <deque>
#include <list>
using std::deque;
using std::list;
using namespace std;
/*
使用C++实现printf函数
printf("hello, %s %d %f", "world", 10, 1.1);
*/
void Myprintf(const char *str)
{
cout << str << endl;
}
template <typename T, typename... Args>
void Myprintf(const char *str, const T &val, Args... args)
{
int i = 0;
while (str[i])
{
if (str[i] == '%')
{
char c = str[i + 1];
switch (c)
{
case 'd':
cout << val;
Myprintf(str + i + 2, args...);
return;
case 'c':
cout << val;
Myprintf(str + i + 2, args...);
return;
case 's':
cout << val;
Myprintf(str + i + 2, args...);
return;
default:
cout << "Wrong!Error has happended!" << endl;
exit(-1);
}
}
else
{
cout << str[i++];
}
}
}
int main()
{
Myprintf("hello, %d %d,%c ,%s\n", 1, 2, 'c', "asfd");
Myprintf("hahah");
return 0;
}