当前位置: 首页 > news >正文

使用Variadic Templates(可变参数模板)实现printf

最近学习了C++2.0版本的一些新的特性,利用Variadic Templates(可变参数模板)实现printf函数。

语言环境

Dev-C++ 5.11
并需要自己的环境是支持C++11的,例如:Dev-C++ 5.11可以通过以下步骤进行修改:
在这里插入图片描述
在这里插入图片描述

源码

#include <iostream>
#include <stdexcept>using namespace std;
namespace myPrintf {void printf(const char *s) {while(*s) {if(*s=='%'&&*(++s)!='%')throw std::runtime_error("invalid format string:missing arguments");std::cout<<*s++;}}template<typename T,typename... Args>void printf(const char *s,T value,Args... args) {while(*s) {if(*s=='%'&&*(++s)!='%') {std::cout<<value<<"    ";printf(++s,args...);return;}std::cout<<*s++;}throw std::logic_error("extra arguments provided to printf");}}int main() {int *pi=new int;myPrintf::printf("%d%s%p%f\n",15,"this is a test",pi,3.14);system("pause");return 0;
}

原理

  1. 在调用自己实现的printf时,也就是void printf(const char *s,T value,Args... args),就会分为第一个参数15,和之后的一堆;
  2. 经过while的判断,打印出第一个参数,然后将s指针加一,即指向下一个%,再次递归调用printf;
  3. 以此类推,当最后只剩余一个参数的时候,就会调用void printf(const char *s)

运行结果展示

在这里插入图片描述

注意:

  1. 一定要在自己的命名空间下,否则会和标准库中的printf冲突;
  2. 一定要对最后一个只有一个参数的函数,进行处理,否则编译器不知道该如何处理最后一个参数;
  3. 要保证编译器支持C++11

同理

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • electron 配置、打包 -报错解决
  • RocketMQ 的认证与授权机制
  • Hive自定义Serde,实现自定义多字符串作为分隔符
  • 【C++】对象模型和this指针
  • vivado ODT
  • 【HarmonyOS NEXT星河版开发学习】小型测试案例01-今日头条置顶练习
  • 【算法速刷(4/100)】LeetCode —— 155.最小栈
  • Java反序列化漏洞实战:原理剖析与复现步骤
  • 与大语言模型Transformer的奇妙旅程
  • 手机三要素接口怎么对接呢?(二)
  • MediaHub中的卡片实现进展汇报
  • 数据结构:链表经典算法OJ题
  • 【Linux】权限理解
  • Python的lambda函数
  • dockerfile之vllm大模型镜像构建
  • JS 中的深拷贝与浅拷贝
  • js中forEach回调同异步问题
  • Just for fun——迅速写完快速排序
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Python3爬取英雄联盟英雄皮肤大图
  • Ruby 2.x 源代码分析:扩展 概述
  • WebSocket使用
  • 给初学者:JavaScript 中数组操作注意点
  • 一起参Ember.js讨论、问答社区。
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • - 转 Ext2.0 form使用实例
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • ​必胜客礼品卡回收多少钱,回收平台哪家好
  • #知识分享#笔记#学习方法
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (新)网络工程师考点串讲与真题详解
  • ***详解账号泄露:全球约1亿用户已泄露
  • ***原理与防范
  • **python多态
  • ./configure,make,make install的作用
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net core 3.0 linux,.NET Core 3.0 的新增功能
  • .net core 6 集成和使用 mongodb
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET 使用 XPath 来读写 XML 文件
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET命名规范和开发约定
  • .NET学习全景图
  • /proc/stat文件详解(翻译)
  • @JoinTable会自动删除关联表的数据
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell