c++ 进阶 (四)template <class identifier>

函数模板

template <class identifier> function_declaration;
template <typename identifier> function_declaration;
//method.cpp文件
template<typename T> T sum_1(T& a, T& b)
{
    return a + b;
}
//method.h文件
#ifndef _method_
#define _method_
#include "method.cpp"
#endif
//main.cpp文件
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "method.cpp"

using namespace std;

int num1 = 1, num2 = 2;
double c = 2.5, d = 4.5;
int main() {
    printf("sum:%d\n", sum_1<int>(num1, num2));
    printf("sum:%0.2f\n", sum_1<double>(c, d));
    return 0;
}

类模板 和 模板参数

  原因:类的函数定义不能放在stack.cpp中,必须放在stack.h(类的函数声明和定义放在同一个文件下)中,否则模板不会被识别。

template<class T, T def_val> class Stack{...}

 上述类模板的栈有一个限制,就是最多只能支持100个元素,我们可以使用模板参数配置这个栈的最大元素数,如果不配置,就设置默认最大值为100,代码如下:

//statck.h
#ifndef _stack_
#define _stack_
template<class T, int maxsize = 100> class Stack
{
public:
	Stack();
	~Stack();
	void push(T x);//入栈没有返回函数
	T pop();//返回的是出栈的数值
	bool isEmpty();
private:
	T* m_pT;
	int maxSize;
	int m_size;
};

//stack.cpp函数声明,因为报错,所以放在头文件里面
template<class T, int maxsize> Stack<T, maxsize>::Stack() 
{
	maxSize = maxsize;
	m_size = 0;
	m_pT = new T[maxSize];
}
template<class T, int maxsize> Stack <T, maxsize>::~Stack()
{
	delete[] m_pT;
}
template<class T, int maxsize> void Stack <T, maxsize>::push(T t)
{
	m_size++;//栈的长度加1
	m_pT[m_size - 1] = t;//入栈
}
template<class T, int maxsize> T Stack <T, maxsize>::pop()
{
	T t = m_pT[m_size - 1];//拿到最后的数值
	m_size--;//出栈
	return t;
}
template<class T, int maxsize> bool Stack <T, maxsize>::isEmpty()
{
	return m_size == 0;
}
#endif

//main.cpp
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "stack.h"

using namespace std;

int main() 
{
	int maxsize = 50;
	Stack<int, 50> intStack;//这个写法要记住
	for (size_t i = 0; i < maxsize; i++)
	{
		intStack.push(i);
	}
	while (!intStack.isEmpty())
	{
		printf("%d\n", intStack.pop());
	}
    return 0;
}

模板专门化

//vector.h
#ifndef _vector_
#define _vector_
template<class T> class compare
{
public:
	bool equal(T t1, T t2);
};

template<>class compare<char*>//template中如果有特例,需要重新定义一下
{
public:
    bool equal(char* t1, char* t2)
    {
        return strcmp(t1, t2) == 0;
    }
};

//vector.cpp函数声明,因为报错,所以放在头文件里面
template<class T> bool compare<T>::equal(T t1, T t2)
{
	return t1 == t2;
}

#endif /*vector*/

//main.cpp
#include<iostream>
#include<string.h>
#include<string>
#include<math.h>
#include<numeric>
#include<vector>
#include<stack>
#include<bitset>
#include<algorithm>
#include<iomanip>
#include<set>
#include<map>
#include<stdio.h>
#include "vector.h"

using namespace std;

char str1[] = "hello!", str2[] = "hello!";

int main() 
{
	compare<int> c1;
	compare<char> c2;
	cout << c1.equal(1, 1) << endl;
	cout << c2.equal(*str1, *str2) << endl;
    return 0;
}

模板类型转换

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值