首页 > 编程语言 >C++学习:模版进阶:非类型模板参数 特化 分离编译

C++学习:模版进阶:非类型模板参数 特化 分离编译

时间:2024-09-29 18:19:04浏览次数:8  
标签:进阶 模版 cout C++ 参数 template Data 特化

目录

一:非类型模版参数

二:模版特化

三:函数模版特化

四:类模版特化

一:全特化(将模板参数列表中所有的参数都确定化)

二:偏特化(部分特化或更进一步限制)

五:模版分离编译


一:非类型模版参数

非类型模版参数是在模版参数列表中,跟在模版参数后面的,就是用常量当参数(下面的n就是)

template<class T,size_t n>
class stack
{

private:
    T  a[n];
    size_t size;
};

二:模版特化

我们为什么要模版特化?因为有些情况用一个模版会出错,比如比大小时传了指针,这时候大小就不一定了,所以我们自己要特化一下让程序按你心意来。

三:函数模版特化

步骤:1.先有一个基础的模版

           2.关键字template后面接一对空的尖括号<>

           3.函数名后跟一对尖括号,尖括号中放需要特化的类型

            4.参数类型必须和基础模版相同

template<class T>
bool less(T left, T right)
{
    return left < right;
}
template<>
bool less(Date*)(Date* left,Date* right)
 { return  *left < *right;
}
int main()
{
    Date d1(2024, 9, 28);
    Date d2(2024, 9, 20);
    cout << Less(d1, d2) << endl;
    Date* p1 = &d1;
    Date* p2 = &d2;
    cout << Less(p1, p2) << endl;//走特化的
    return 0;
}

注意:一般不进行函数模版特化,不如直接给个函数来的简洁明了

四:类模版特化

一:全特化(将模板参数列表中所有的参数都确定化)

template<class T1, class T2>
class Data
{
public:
 Data() {cout<<"Data<T1, T2>" <<endl;}
private:
 T1 _d1;
 T2 _d2;
};
template<>
class Data<int, char> {
public:
 Data() {cout<<"Data<int, char>" <<endl;}
private:
 int _d1;
 char _d2;};
void TestVector()
{
 Data<int, int> d1;
 Data<int, char> d2;
}

二:偏特化(部分特化或更进一步限制)

// 将第二个参数特化为int
template <class T1>
class Data<T1, int> {
public:
 Data() {cout<<"Data<T1, int>" <<endl;}
private:
 T1 _d1;
 int _d2;
}; 
//两个参数偏特化为指针类型
template <typename T1, typename T2>
class Data <T1*, T2*>
{ 
public:
 Data() {cout<<"Data<T1*, T2*>" <<endl;}
 
private:
T1 _d1;
 T2 _d2;
};

五:模版分离编译

不要声明定义分离编译!因为如果分离了,模版没有实例化,编译器会找不到这个模版,链接时会报错!所以就声明定义放一起!

感谢你看到这,大家共同进步!

标签:进阶,模版,cout,C++,参数,template,Data,特化
From: https://blog.csdn.net/lxy2977262881/article/details/142611186

相关文章

  • c++线程--快速上手
    线程创建头文件#includethread是在C++11标准中引入的。C++11标准引入了对多线程编程的标准化支持,其中包括了线程的创建、管理和同步机制。头文件提供了基本的线程支持库,允许开发者直接使用c++线程进行并行编程,而无需依赖操作系统特定的API#include<iostream>#include......
  • 基于C++11的数据库连接池环境配置
    欢迎访问我的另一个博客:https://xingzhu.top/ubuntu安装python2由于接下来要使用python,所以先安装python#安装python2.7.18即可#python3不行,版本过高,会报错sudoaptinstallpython2python2--version安装完成后我们可以使用如下命令来检查目前可用的Pyt......
  • C++的并发编程历史
    多线程环境并非所有的语言都提供了多线程的环境。即便是C++语言,直到C++11标准之前,也是没有多线程支持的。在这种情况下,Linux/Unix平台下的开发者通常会使用POSIXThreads,Windows上的开发者也会有相应的接口。但很明显,这些API都只针对特定的操作系统平台,可移植性较差。如果要同......
  • 南沙C++信奥赛陈老师解一本通题 1973:【16NOIP普及组】买铅笔
    ​ 【题目描述】P老师需要去商店买n支铅笔作为小朋友们参加NOIP的礼物。她发现商店一共有3种包装的铅笔,不同包装内的铅笔数量有可能不同,价格也有可能不同。为了公平起见,P老师决定只买同一种包装的铅笔。商店不允许将铅笔的包装拆开,因此P老师可能需要购买超过n支铅笔才够给小......
  • C++游戏开发:构建高性能、沉浸式游戏体验的关键
    引言C++作为游戏开发的核心语言,凭借其卓越的性能和灵活性,已成为许多现代游戏引擎和开发项目的首选。在游戏开发中,C++不仅可以实现复杂的游戏逻辑,还能有效管理资源和优化性能。本文将深入探讨C++在游戏开发中的应用,结合先进的技术、设计模式和最佳实践,帮助开发者提升游戏开发的......
  • 南沙C++信奥赛老师解一本通题1217:棋盘问题
    ​ 【题目描述】在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 kk 个棋子的所有可行的摆放方案 CC。【输入】输入含有多组测试数据。每组数据......
  • C++ const_cast 和重载
    在4.11.3节(第145页)中我们说过,const_cast在重载函数的情景中最有用。举个例子,回忆6.3.2节(第201页)的shorterstring函数://比较两个string对象的长度,返回较短的那个引用conststring&shorterString(conststring&sl,conststring&s2){returnsl.size()<=s2.size()?......
  • C++中使用Qt实现JSON序列化与反序列化
    //File:JsonSerializer//Author:[email protected]//Creation:2024/09/29#ifndefJSON_SERIALIZER_H#defineJSON_SERIALIZER_H#include<QJsonDocument>#include<QJsonObject>#include<QJsonArray>#include<QJsonValue>#includ......
  • 【C++】继承(下)
    个人主页~继承(上)~继承四、派生类的默认成员函数五、继承与友元六、继承与静态成员七、复杂的菱形继承以及菱形虚拟继承1、菱形继承2、菱形虚拟继承八、继承的总结与反思继承和组合四、派生类的默认成员函数派生类的构造函数必须调用基类的构造函数初始化基类的......
  • C++ -引用-详解
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......