C++模板template用法详解并用typename...实现printf函数

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值