C++模板与泛型编程基础

  泛型编程就是以独立于任何特定类型的方式编写代码,而模板是反省编程的基础。

1. 定义函数模板(function template)

  函数模板是一个独立于类型的函数,可以产生函数的特定类型版本。

// implement strcmp-like generic compare function
template<typename T>
int compare(const T &v1, const T &v2)
{
    if(v1 < v2) return -1;
    if(v1 > v2) return 1;
}

  模板定义以关键字template开始,后接尖括号括住的模板形参表。

  模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。上面程序中的 T是类型形参。

  使用函数模板时,编译器会将模板实参绑定到模板形参。编译器将确定用什么类型代替每个类型参数,用什么值代替每个非类型形参,然后产生并编译(称为实例化)改版本的函数。

  上面的例子中,编译器用int代替T创建第一个版本,用string代替T创建第二个版本。
  函数模板也可以生命为inline。

template<typename T>
inline T min(const T &m, const T &n);

2. 定义类模板(class template)

  在定义的类模板中,使用模板形参作为类型或值得占位符,在使用类时再提供具体的类型或值。

template<typename T>
class Queue
{
public:
    Queue();
    T & front();
    const T & front() const;
    void push(const T &);
    void pop();
    bool empty() const;
private:
};

  与调用函数模板不同,使用类模板时,必须为模板形参显示指定实参。

Queue<int> qi;

3. 模板类型形参

  类型形参由关键字class或typename后接说明符构成。在函数模板形参表中,二者含义相同。typename其实比class更直观,更清楚的指明后面的名字是一个类型名(包括内置类型),而class很容易让人联想到类声明或类定义。
  此外,在使用嵌套依赖类型(nested depended name)时,必须用到typename关键字。
  在类的内部可以定义类型成员。如果要在函数模板内部使用这样的类型,必须显示告诉编译器这个名字是一个类型,否则编译器无法得知它是一个类型还是一个值。默认情况下,编译器假定这样的名字指定(静态)数据成员,而不是类型。所以下面这段程序,如果去掉typename关键字,将会出现编译错误。

4. 非类型模板形参

  模板形参也可以是非类型形参,在使用时非类型形参由常量表达式代替。

// initialize elements of an array to zero
template<typename T, size_t N>
void array_init(T (&param)[N])
{
    for(size_t i = 0; i != N; i++)
        param = 0;
}
…
int x[42];
double y[10];
array_init(x); // instantiates array_init(int (&)[42])
array_init(y); // instantiates array_init(double (&)[10])

5. 编写泛型程序

  模板代码需要对使用的类型做一些假设,比如上面的compare()要求类型T重载了“<”操作符,所以函数模板内部完成的操作就限制了可用于实例化该函数的类型。
  编写模板代码时,对实参类型的要求应尽可能少。比如compare()函数使用了“<”操作符,而没有使用“>”操作符。

转自:泛型编程基础

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值