C++模板扩展

简介: C++模板扩展

非类型模板参数

模板参数中不是只有类型的,非类型的模板参数,该参数类型是整形,浮点数等不可以。

#include<iostream>
using namespace std;
template<class T, int N>//N可以设置缺省值
class app
{
public:
  void print()
  {
    cout << a << endl;
  }
private:
  T a = N;
};
int main()
{
  app<int, 10> a;
  a.print();
  return 0;
}

STL当中有一个array的容器:

第一个参数是类型,决定数组的类型,第二个是非类型,决定数组的容量。

这个容器可以对于数组下标是否越界进行检查,而C语言当中的数组是进行抽查。

模板的特化

举个例子,模板虽然能实例化各种类型,但是对于某些特殊类型进行实例化之后得不到想要的结果:

#include<iostream>
using namespace std;
template<class T>
bool compare(T x, T y)
{
  return x < y;
}
int main()
{
  int a = 10;
  int b = 20;
  int c = compare(a, b);//这里比较的是a和b值的大小
  cout << c << endl;
  int d = compare(&a, &b);//这里返回的结果就不一定是想要的了,因为比较的是地址
  cout << d << endl;
  return 0;
}

这时,就需要对模板进行特化。

即:在原模板类的基础上,针对特殊类型所进行特殊化的实现方式。

函数模板的特化

#include<iostream>
using namespace std;
template<class T>
bool compare(T x, T y)
{
  return x < y;
}
//特殊化
template<>//下面的<int*>省略这行也可以省略
bool compare<int*>(int* x, int* y)//这里也可以省略掉<int*>
{
  return *x < *y;
}
int main()
{
  int a = 10;
  int b = 20;
  int c = compare(a, b);//这里走模板
  cout << c << endl;
  int d = compare(&a, &b);//这时候就不会走模板而是走模板的特化
  cout << d << endl;
  return 0;
}

类模板的特化

全特化

//原本的类模板
#include<iostream>
using namespace std;
template<class T1, class T2>
class Date
{
public:
  Date()
  {
    cout << "正常模板" << endl;
  }
private:
  T1 a;
  T2 b;
};
//全特化
template<>
class Date<int, char>
{
public:
  Date()
  {
    cout << "全特化" << endl;
  }
private:
  int a;
  char b;
};
int main()
{
  Date<int, int>a1;
  Date<int, char>a2;
  return 0;
}

偏特化

也称为半特化,只对部分参数进行特化,或者是更进一步的限制。

#include<iostream>
using namespace std;
template<class T1, class T2>
class Date
{
public:
  Date()
  {
    cout << "正常模板" << endl;
  }
private:
  T1 a;
  T2 b;
};
//偏特化
template<class T>
class Date<T, int>
{
public:
  Date()
  {
    cout << "偏特化" << endl;
  }
private:
  T a;
  int b;
};
int main()
{
  Date<int, char>a1;
  Date<char, int>a2;
  return 0;
}

进一步的限制

#include<iostream>
using namespace std;
template<class T1, class T2>
class Date
{
public:
  Date()
  {
    cout << "正常模板" << endl;
  }
private:
  T1 a;
  T2 b;
};
//进一步限制
template<class T3,class T4>
class Date<T3*, T4*>//也可以是引用版本
{
public:
  Date()
  {
    cout << "进一步限制" << endl;
  }
private:
  T3 a;
  T4 b;
};
int main()
{
  Date<int, char>a1;
  Date<int*, int*>a2;
  return 0;
}

注意: 如果参数满足正常模板,偏特化,全特化,优先级的顺序是:

全特化>偏特化>正常模板

相关文章
|
10天前
|
编译器 C语言 C++
c++的学习之路:19、模板
c++的学习之路:19、模板
30 0
|
24天前
|
存储 C++ 容器
C++STL(标准模板库)处理学习应用案例
【4月更文挑战第8天】使用C++ STL,通过`std:vector`存储整数数组 `{5, 3, 1, 4, 2}`,然后利用`std::sort`进行排序,输出排序后序列:`std:vector<int> numbers; numbers = {5, 3, 1, 4, 2}; std:sort(numbers.begin(), numbers.end()); for (int number : numbers) { std::cout << number << " "; }`
21 2
|
25天前
|
编译器 C++
【C++初阶】13. 模板进阶
【C++初阶】13. 模板进阶
25 2
|
1月前
|
C++
C++当类模板遇到static
C++当类模板遇到static
|
1月前
|
算法 C++ 容器
C++中模板函数以及类模板的示例(template)
C++中模板函数以及类模板的示例(template)
|
2月前
|
编译器 C++
C++入门指南:10分钟带你快速了解模板究竟是什么(建议收藏!!)
C++入门指南:10分钟带你快速了解模板究竟是什么(建议收藏!!)
34 0
|
2月前
|
编译器 C++
【C++练级之路】【Lv.11】模板(你真的了解模板特化和分离编译吗?)
【C++练级之路】【Lv.11】模板(你真的了解模板特化和分离编译吗?)
|
1天前
|
C++
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
【期末不挂科-C++考前速过系列P6】大二C++实验作业-模板(4道代码题)【解析,注释】
|
2天前
|
存储 算法 C++
详解C++中的STL(标准模板库)容器
【4月更文挑战第30天】C++ STL容器包括序列容器(如`vector`、`list`、`deque`、`forward_list`、`array`和`string`)、关联容器(如`set`、`multiset`、`map`和`multimap`)和容器适配器(如`stack`、`queue`和`priority_queue`)。它们为动态数组、链表、栈、队列、集合和映射等数据结构提供了高效实现。选择合适的容器类型可优化性能,满足不同编程需求。
|
4天前
|
运维 Serverless Go
Serverless 应用引擎产品使用之在阿里云函数计算中c++模板,将编译好的C++程序放进去部署如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
9 1