C++函数模板

举例:实现compare函数的函数模板、函数模板的特例化、非模板函数、 函数模板的重载。

template<typename T>//函数模板
bool compare(const T a, const T b)
{
	cout << "bool compare(const T a, const T b)" << typeid(T).name() << endl;
	return a > b;
}

typedef char* CharPtr;
template<>//模板的特例化
bool compare<CharPtr>(const CharPtr a, const CharPtr b)
{
	cout << "bool compare<CharPtr>(const CharPtr a, const CharPtr b)" << endl;
	return strcmp(a, b)> 0;
}

bool compare(const double a,const double b)//非模板函数
{
	cout << "bool compare(const double a,const double b)" << endl;
	return a > b;
}

template<typename T>//函数模板的重载
bool compare(const T arr1, int len1, const T arr2, int len2)
{
	cout << "bool compare(const T arr1, int len1, const T arr2, int len2)" << endl;
	for (int i = 0, j = 0; i < len1&&j < len2; i++, j++)
	{
		if (arr1[i]>arr2[j])
		{
			return true;
		}
		if (i == len1)
		{
			return false;
		}
	}
        return true;
}

int main()
{
	compare(10,20);
	compare(10.0, 20.0);
	compare("hello", "world");
	compare<char *>("hello", "world");
	compare("hello", 5, "world", 5);

	return 0;
}

执行结果:

举例:类型作为模板类型参数。

实现选择排序的函数模板,排序又分为由大到小和由小到大,可实现其对应的函数模板和模板的特例化,将以上函数模板和模板的特例化,定义为一种类型,作为选择排序函数模板的类型参数。

template<typename T>
bool Mymore(const T a,const T b)
{
	cout << "bool Mymore(const T a,const T b)" << typeid(T).name() << endl;
	return a > b;
}

typedef char* CharPtr;
template<>
bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)
{
	cout << "bool Mymore<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
	return strcmp(a, b) > 0;
}

template<typename T>
bool myless(const T a, const T b)
{
	cout << "bool myless(const T a, const T b)" << typeid(T).name() << endl;
	return a < b;
}

template<>
bool myless<CharPtr >(const CharPtr a, const CharPtr b)
{
	cout << "bool myless<CharPtr >(const CharPtr a, const CharPtr b)" << endl;
	return strcmp(a, b) < 0;
}

//类型作为模板类型参数   
template<typename T,typename PRE>//PRE自动推演出模板类型参数
void Sort(T arr[], int len,PRE pre)
{
	cout << "void Sort(T arr[], int len,PRE pre)" << typeid(T).name() << endl;
	cout << typeid(PRE).name() << endl;
	T tmp;
	int i;
	for (i = 0; i < len; i++)
	{
		for (int j = i; j < len; j++)
		{
			//if (arr[i] > arr[j]) 从小到大
			//if (arr[i] < arr[j]) 从大到小
			//if (Mymore(arr[i], arr[j]))
			///if (myless(arr[i],arr[j]))
			if (pre(arr[i], arr[j]))
			{
				tmp = arr[i];
				arr[i] = arr[j];
				arr[j] = tmp;
			}
		}
	}
}


int main()
{
	int arr[] = { 1, 2,99};
	Sort(arr, 3,Mymore<int>);//注意传参方式!!!
	for (int i = 0; i < 3; i++)
	{
		cout << arr[i] << "   ";
	}
	cout << endl;

	char *arr2[] = { "aas","frg","dfg" };
	Sort<char*>(arr2, 3,myless<char*>);
	for (int i = 0; i < 3; i++)
	{
		cout << arr2[i] << "   ";
	}
	cout << endl;
}

运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值