用C++可变参数模板实现类似C语言的printf
来源:互联网 发布:linux is a directory 编辑:程序博客网 时间:2024/06/06 03:47
在以前,C++要实现可变参数的函数,得用C语言的va_list那一套东西,直到C++11的可变参数模板诞生,正好最近在写一个日志模块,是时候了解一下可变参数模板了。
下面这个简单的Log函数,只使用##进行占位,并没有区分类型,有点像C#的{0}、{1}……
#include <iostream>#include <sstream>#include <string>template<typename ...Args>void mylog(const std::string& format, const Args&... args) {std::string temp(format);mylog(temp, args...);}template<typename Next, typename ...Other>void mylog(std::string& format, const Next& next, const Other&... other) {auto index = format.find_first_of("##");if (index == std::string::npos) {mylog(format);}else {std::ostringstream oss;oss << next;format.replace(index, 2, oss.str());mylog(format, other...);}}void mylog(std::string& format) {std::cout << format;}int main() {// 无占位符mylog("Hello Indian Mi fans!\n");// 有占位符mylog("Do you like Mi##?\n", "4i");// 占位符超过参数数量,多余的占位符原样输出mylog("My name is ####!\n", "Stephen");// 参数数量超过占位符数量,多余的参数被忽略mylog("## is ## years old, ## meters tall.\n", "Stephen", 18, 1.75f, "useless", "useless");// 参数不能被格式化为字符串,发生编译错误//mylog("Here comes a compile error ##\n", std::cout);return 0;}
运行结果:
要注意的是:
1. Args...可以是任意数量个参数,包括0个。
2. args...形式的参数包只能通过递归的方式解开。
3. 用sizeof...(args)可以得到此参数包的参数个数。
4. 宏替换有效:#define DEBUG(format, ...) mylog(format, ##__VA_ARGS__)。
阅读全文
0 0
- 用C++可变参数模板实现类似C语言的printf
- 【C语言】用可变参数列表实现printf函数
- 【c语言】用可变参数列表实现一个简化的printf函数
- C语言实现printf函数,即参数可变函数原理
- C语言可变参数列表详述及实现printf函数
- C语言可变参数列表详述及实现printf函数
- c语言中可变参数的原理---printf()函数
- c语言中可变参数的原理---printf()函数
- 【C语言】printf函数的简单实现(可变参数列表)
- 【C语言】模拟实现printf函数 可变参数列表的实战
- C语言可变参数函数的实现
- C语言可变参数函数的实现
- C语言可变参数的函数实现
- c语言中可变参数的实现
- C语言可变参数的实现详解
- C语言中可变参数的实现
- C语言可变参数的实现详解
- C语言可变参数的实现机制
- 【Openjudge】前缀中的周期
- c++访问控制与继承
- 微信公众平台开发入门教程
- HDU-1233 还是畅通工程(prim)
- 幂运算
- 用C++可变参数模板实现类似C语言的printf
- nginx 自启动
- 利用深度优先搜索算法和广度优先搜索算法解迷宫问题
- Rhyme/ java TCP网络编程 聊天室(群聊与私聊)TCP、多线程、IO流编程完整代码实现
- SpringMVC详解
- strstr函数的用法
- 前端基础 css笔记
- Java多线程的6种状态
- Functional Interface- java8引入特性