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;
}

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

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

目录
打赏
0
0
0
0
19
分享
相关文章
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
㉿㉿㉿c++模板的初阶(通俗易懂简化版)㉿㉿㉿
|
5月前
|
C++ STL 初探:打开标准模板库的大门
C++ STL 初探:打开标准模板库的大门
150 10
|
10天前
|
【c++】模板详解(2)
本文深入探讨了C++模板的高级特性,包括非类型模板参数、模板特化和模板分离编译。通过具体代码示例,详细讲解了非类型参数的应用场景及其限制,函数模板和类模板的特化方式,以及分离编译时可能出现的链接错误及解决方案。最后总结了模板的优点如提高代码复用性和类型安全,以及缺点如增加编译时间和代码复杂度。通过本文的学习,读者可以进一步加深对C++模板的理解并灵活应用于实际编程中。
27 0
深入理解C++模板编程:从基础到进阶
在C++编程中,模板是实现泛型编程的关键工具。模板使得代码能够适用于不同的数据类型,极大地提升了代码复用性、灵活性和可维护性。本文将深入探讨模板编程的基础知识,包括函数模板和类模板的定义、使用、以及它们的实例化和匹配规则。
【实战指南】4步实现C++插件化编程,轻松实现功能定制与扩展
本文介绍了如何通过四步实现C++插件化编程,实现功能定制与扩展。主要内容包括引言、概述、需求分析、设计方案、详细设计、验证和总结。通过动态加载功能模块,实现软件的高度灵活性和可扩展性,支持快速定制和市场变化响应。具体步骤涉及配置文件构建、模块编译、动态库入口实现和主程序加载。验证部分展示了模块加载成功的日志和配置信息。总结中强调了插件化编程的优势及其在多个方面的应用。
735 71
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
143 4
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
56 3
|
4月前
|
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
55 0
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
39 1

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等