自定义模板

一、几个概念

1.模板的实例化:

模板是程序的样板,也就是将具备相同规律(算法)的功能,忽略操作数类型的不同定义程一个模板。在真正使用时,使用明确的数据类型替换待定类型,使通用程序具体化,这个过程称为模板的实例化。

2.全特化:

特殊化模板头形式是template<>,模板形参中没有任何参数,这样的模板特殊化称为全特化。

编译器执行程序时,如果存在多个重载关系的模板,匹配规则是:先匹配特殊化的模板,如果没有匹配成功,再匹配通用的模板。

3.偏特化:

模板的形式部分确定下来,该形式前面已经用过。

例子:使用偏特化来实现排序:

具体要求:

(1)实现支持多种类型的数据排序的函数模板

a.函数模板sort,参考定义形式:template<typename> void sort(T a[], int n, bool type){//……}

其中参数n表示数组a中参数排序的个数,type表示排序的类型,0(false)升序,1(true)表示降序。

b.函数模板show,用于显示指定个数的数组元素,参考定义形式:template<typename T> void show(T a[], int n){//……}

c.函数模板sort_data,用于实现分别显示一组数组的原始数据,升序数据,降序数据,在实现的过程中可以调用函数模板sort,show。sort_data函数模板的参考定义形式:template<typename T> void sort_data(T a[], int n){//……}

(2)compare函数模板首先实现一个通用模式。

(3)再重载compare函数模板,使用全特化形式处理C风格字符串。

(4)sort、sort_data、show三种函数模块使用偏特化。

(5)支持char、int、float、char*、string等类型数据的升降排序。

#include<iostream>
#include<cstring>
using namespace std;


template<typename T>
bool compare(T &v1, T &v2, bool flag)
{
return ((v1 < v2) ^ flag);
}


template<>
bool compare(char* &p1, char* &p2, bool flag)
{
return (strcmp(p1, p2) < 0) ^ flag;
}


template<typename T, int N, bool flag>
void sort(T a[])
{
for(int i = 0; i < N - 1; i++)
for(int j = N - 1; j > i; j--) 
{
if(compare<T>(a[j], a[j - 1], flag))
            {
T temp = a[j];
a[j] = a[j - 1];
a[j - 1] = temp;
            }
        }    
}


template<typename T, int N>
void show(T a[])
{
    for(int i = 0; i < N; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
}


template<typename T, int N>
void sort_data(T a[])
{
    cout << "*************************************" << endl;
    cout << "old data:";
    show<T, N>(a);


    cout << "Asc data:";
    sort<T, N, false>(a);
    show<T, N>(a);


    cout << "Desc data:";
    sort<T, N, true>(a);
    show<T, N>(a);
    cout << "*************************************" << endl;
}


int main()
{
    int a[] = {100, 2, 76, 98, 33, 77, 55, 22, 88, 99};
    char c[] = "comeonbaby";
    float f[] = {11.11, 2.2, 777.7, 8888.88, 555.55};
    string s[] = {"There", "is", "an", "apple!"};
    char *sp[] = {"Do", "you", "keep", "your", "eyes", "upon", "the", "doughnut"};
    sort_data<int, sizeof(a) / sizeof(a[0])>(a);
    sort_data<char, sizeof(c) / sizeof(c[0]) - 1>(c); 
    sort_data<float, sizeof(f) / sizeof(f[0])>(f);
    sort_data<string, sizeof(s) / sizeof(s[0])>(s);
    sort_data<char*, sizeof(sp) / sizeof(sp[0])>(sp);
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EasyCode是一个用于快速生成代码的工具,它可以根据用户的需求生成各种不同类型的代码文件。在EasyCode中,我们可以自定义模板来满足我们的具体需求。 首先,通过打开EasyCode的设置界面,我们可以看到一个“代码模板”或类似的选项。点击进入该选项后,我们可以看到现有的一些预设的模板,例如Java类、HTML页面等。在这里,我们可以选择一个模板作为基础,然后进行修改或添加新的模板。 在自定义模板界面,我们可以对模板的内容进行编辑。一个模板通常包含了许多占位符,这些占位符将在生成代码时被实际的值替代。我们可以添加、修改或删除这些占位符,以生成符合我们需求的代码。 例如,假设我们需要一个自定义的Java类模板,在里面包含了一些常见属性和方法。我们可以在模板中定义属性的名称和类型,并在方法中预设一些基本的操作,如getters和setters。然后,当我们使用这个模板生成代码时,我们只需要按照提示输入实际的变量名和类型,EasyCode就会根据我们的输入自动生成相应的代码。 通过自定义模板,我们可以根据我们的实际需求,生成适应性更强、更高效的代码。我们可以根据自己的开发习惯和项目需求,定制属于自己的代码模板,从而提高开发效率和代码质量。 总之,EasyCode的自定义模板功能为我们提供了一个方便快捷的方式来生成我们所需要的代码。通过自定义模板,我们可以根据自己的需求生成符合标准、高效的代码,提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值