首页 > 编程语言 >c++模版多参数的递归用法--自定义log

c++模版多参数的递归用法--自定义log

时间:2023-05-11 11:25:53浏览次数:36  
标签:std 自定义 format -- ostringstream c++ && include os

#include <iostream> #include <sstream> #include <string> #include <tuple> #include <type_traits>
template <typename T> void print_impl(std::ostringstream& os, const char* format, T&& arg) { while (*format) { if (*format == '{' && *(format + 1) == '}') { os << arg; format += 2; return; } os << *format++; } }
template <typename T, typename... Args> void print_impl(std::ostringstream& os, const char* format, T&& arg, Args&&... args) { while (*format) { if (*format == '{' && *(format + 1) == '}') { os << arg; print_impl(os, format + 2, std::forward<Args>(args)...); return; } os << *format++; } }
template <typename... Args> void sys_transform(const char* format, Args&&... args) { std::ostringstream os; print_impl(os, format, std::forward<Args>(args)...); std::cout<<os.str()<<std::endl; }   //重载函数使得兼容无参数case
void sys_transform(const char* format) { std::ostringstream os; while (*format) { if (*format == '{' && *(format + 1) == '}') { os << "null"; format += 2; continue; } os << *format++; } std::cout<<os.str()<<std::endl; } #define MYLOG(log_str, ...) sys_transform(log_str, ##__VA_ARGS__) int main () { int i = 1; MYLOG("hello :{}", i); MYLOG("hello :{}", "world"); MYLOG("hello :{}"); }

标签:std,自定义,format,--,ostringstream,c++,&&,include,os
From: https://www.cnblogs.com/huahuagongzi521/p/17390485.html

相关文章

  • Go源码阅读——github.com/medcl/esm —— http.go
    esm(AnElasticsearchMigrationTool)——http.gohttps://github.com/medcl/esmrelease:8.7.1通过阅读好的源代码,细致思考,理性分析并借鉴优秀实践经验,提高zuoyang的编程水平,所谓"他山之石,可以攻玉" 该是如此吧。 /*Copyright2016Medcl(mATmedcl.net)Licensed......
  • 自定义信息提示框dialog.js
    varowner;functiongetOwner(){ if(owner) returnowner; varowner=window; try{ if(top.document.domain==window.document.domain){ if(top.length>1) owner2=top[0]; else owner=top; } }catch(ex){ while(owner.p......
  • pid控制器
    pid是我学习的第一个控制算法,是最基础的也是最重要的控制算法。通过输入系统当前的实际值和系统期望到达的目标值,输出和误差相关的一个数量值,一般作为发送给电机的电流值或电压值,通过闭环实时改变反馈,实现对系统的控制效果。pid的输出由三个方面组成,首先是比例控制proportion,p值......
  • 基于龙伯格观测器的永磁同步电机负载转矩估计 1.采用降阶负载转矩观测器简
    基于龙伯格观测器的永磁同步电机负载转矩估计1.采用降阶负载转矩观测器简化观测器结构,便于参数设计;2.将观测到的负载转矩用作前馈补偿,可提高系统抗负载扰动能力;仿真模型纯手工搭建,不是从网络上复制得到。仿真模型仅供学习参考ID:918681989979172......
  • js 实现类chatgpt流式传输
    startStreaming(){//创建XMLHttpRequest对象constxhr=newXMLHttpRequest();//设置请求的URLxhr.open('GET',"接口");//设置响应类型为text/event-streamxhr.setRequestHeader('Content-Type','te......
  • 基于最小二乘支持向量机的短期电力负荷预测:
    基于最小二乘支持向量机的短期电力负荷预测:ID:4540613019858578......
  • 无法加载文件或程序集“ Newtonsoft.Json”或其依赖项之一清单定义与程序集引用不匹配
    无法加载文件或程序集“Newtonsoft.Json”或其依赖项之一清单定义与程序集引用不匹配的解决方法当一个程序中引用了不同版本的 Newtonsoft.Json.dll,又无法更改时候,可能会报此类错误,那么解决的方法如下:1、把不同的版本的dll放在bin目录下的ref文件夹2、在app.config或者web.......
  • truncate和delete的区别
    truncate和delete的区别在于四个方面:1.条件删除、2.事务回滚、3.清理速度、4.高水位重置。因为delete是可以带WHERE的,所以支持条件删除;而truncate只能删除整个表。1.条件删除这个比较好理解,因为delete是可以带WHERE的,所以支持条件删除;而truncate只能删除整个表。2.事务......
  • 图像分割例如可以对脑部CT的图像进行处理,把大脑白质部分分割出来。
    图像分割例如可以对脑部CT的图像进行处理,把大脑白质部分分割出来。或者是视网膜的血管提取。ID:8150613310466813......
  • jmeter 美化json响应
    简介在查看结果树中,ResponseBody里的json一般是不换行的,看起来很不方便。这里通过JSR223后置处理器改变响应的格式具体实现首先,我们要把fastjson的jar包放入到jmeterHome/lib/目录(建议放入1.x的版本,因为fastjson2可能需要多个jar包,具体需要哪些我也没有测试),重启jmeter第二步......