c++入门学习日志:初阶 模板

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: c++入门学习日志:初阶 模板

模板就好像一个模子,我们知道古时候会用到各种各样的模子来制作东西,而这种模子就好像是我们的模板一样。模板是模板和它所产生的类或者函数是不一样的,我们产生的类或者函数用的可不是模板  模板分为:函数模板 和 类模板


函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型

template <class T>//class可以用typename替代,但是不能使用struct。后面只能跟一个函数
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a=1,b=2;
    swap(a,b);
}


 这个就是一个函数模板的典型案例,我们调用它时,调用的函数模板产生的函数,不是模板的本身。函数模板的类型一般是编译器根据实参传给形参推演出来的,但是有的时候还是需要我们自己去显示实例化的,比如:test<int>(10);


模板参数也是可以给缺省参数的哦

template <class T = int>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a=1,b=2;
    swap(a,b);
}


模板也是可以声明和定义分离的,但不支持把他们放到两个文件里面,这样会出现链接错误,因为那些放在.c文件的定义,链接是找不到这些函数模板调用的地址(毕竟你不知道这个模板里面的T的类型,编译器自然就不会把这一部分写进符号表里面),除非你去显示实例化指定:

1. template;
2. void swap<int>(int& p,int& q);


template <class T>
void swap(T& p, T& q);
template <class T>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
template <class T>//模板参数可以有多个
class date
{
public:
  date(int a = 1);
private:
  int _hour;
  int* _a;
};
template <class T>
date<T>::date(int a)
{
  _hour = a;
  _a = new T[10];
}

大家觉得这样的代码对嘛:

template <class T>
void swap(T& p, T& q)
{
  T tmp = p;
  p = q;
  q = tmp;
}
int main()
{
    int a = 1;
    double b = 2.0;
    swap(a,b);
}

这样肯定是不行的,编译器在判断T的时候就会矛盾,不知道这里的T应该是int还是double那可以怎么解决呢?

1. swap<int>(a,b);
2. swap<double>(a,b);

其实可以向我们上面这样显示实例化,实际上模板类也是要自己显示实例化才能使用的,除非你自己写的有缺省参数


如果现在有一个函数,还有一个函数模板,模板除了参数是模板参数以外其他都和我们得函数相同,大家觉得这个函数和这个函数模板可以同时存在嘛?存在时调用又是先用哪一个呢


这两个肯定是可以同时存在的,他们完全两种不同的东西,调用的时候自然也是调用我们已经写好的函数,编译器也会图方便去调用更便捷那个 

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
5天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
24 4
2023/11/10学习记录-C/C++对称分组加密DES
|
27天前
|
安全 编译器 C++
【C++11】可变模板参数详解
本文详细介绍了C++11引入的可变模板参数,这是一种允许模板接受任意数量和类型参数的强大工具。文章从基本概念入手,讲解了可变模板参数的语法、参数包的展开方法,以及如何结合递归调用、折叠表达式等技术实现高效编程。通过具体示例,如打印任意数量参数、类型安全的`printf`替代方案等,展示了其在实际开发中的应用。最后,文章讨论了性能优化策略和常见问题,帮助读者更好地理解和使用这一高级C++特性。
42 4
|
27天前
|
算法 编译器 C++
【C++】模板详细讲解(含反向迭代器)
C++模板是泛型编程的核心,允许编写与类型无关的代码,提高代码复用性和灵活性。模板分为函数模板和类模板,支持隐式和显式实例化,以及特化(全特化和偏特化)。C++标准库广泛使用模板,如容器、迭代器、算法和函数对象等,以支持高效、灵活的编程。反向迭代器通过对正向迭代器的封装,实现了逆序遍历的功能。
34 3
|
2月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
1月前
|
编译器 C++
【c++】模板详解(1)
本文介绍了C++中的模板概念,包括函数模板和类模板,强调了模板作为泛型编程基础的重要性。函数模板允许创建类型无关的函数,类模板则能根据不同的类型生成不同的类。文章通过具体示例详细解释了模板的定义、实例化及匹配原则,帮助读者理解模板机制,为学习STL打下基础。
31 0
|
2月前
|
编译器 程序员 C++
【C++打怪之路Lv7】-- 模板初阶
【C++打怪之路Lv7】-- 模板初阶
18 1
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
28 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
37 0
|
1月前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
286 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
10天前
|
监控 安全 Apache
什么是Apache日志?为什么Apache日志分析很重要?
Apache是全球广泛使用的Web服务器软件,支持超过30%的活跃网站。它通过接收和处理HTTP请求,与后端服务器通信,返回响应并记录日志,确保网页请求的快速准确处理。Apache日志分为访问日志和错误日志,对提升用户体验、保障安全及优化性能至关重要。EventLog Analyzer等工具可有效管理和分析这些日志,增强Web服务的安全性和可靠性。
下一篇
DataWorks