C++11可变参数函数模板

C++11可变参数函数模板

在Log时参数是类型和个数是不固定的,所以在做log函数时,很多烦恼,不过C++11给我们带来的希望羡慕

这个是今天刚读到的,加上自己的理解为字节写了一个logger类,也给大家瞧瞧啊,欢迎大虾拍板转

                    

#include <fstream> #include <iostream> using namespace std; class Logger { public: /** * @brief _out_os log输出的地方,默认是std::cout,给赋值时最好是全局变量 */ static ostream * _out_os; /** * @brief _logger_is_on 开关 */ static bool _logger_is_on; static void makeLoggerOn() { _logger_is_on = true; } static void makeLoggerOff() { _logger_is_on = false; } static bool loggerState() { return _logger_is_on; } template<typename... Aargs> static void log(const Aargs&... args) {//这边使用了C++11的可变参数函数模板的特性,说白了,还是递归调用 if (_logger_is_on) { //此处编译器会判断参数的个数,如果是一个则调用logHelper(ostream& os, const T& t1) //否则这是下面的logHelper(ostream& os, const T& t1, const Tn&... args),其自身递归调用,直到只有一个参数,从 //logHelper(ostream& os, const T& t1)作为出口出来 logHelper(*_out_os,args...); *_out_os << endl; } } protected: template<typename T> static void logHelper(ostream& os, const T& t1) { os << t1; } template<typename T, typename... Tn> static void logHelper(ostream& os, const T& t1, const Tn&... args) { os << t1 << ' '; logHelper(os,args...); } }; ostream * Logger::_out_os = & std::cout; bool Logger::_logger_is_on = false; //__func__ 当前的函数名 //__VA_ARGS__,可变参宏 #define log(...) Logger::log(__FILE__,' ',__LINE__,' ',__func__,"():",__VA_ARGS__)

无图无真相,还是来张图吧

另外就是,我用的是g++ 4.7 编译的时候加上-std=c++11

C++11可变参数函数模板

转载于:https://my.oschina.net/u/854744/blog/418207

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109445.html原文链接:https://javaforall.net

(0)
上一篇 2021年9月6日 下午9:00
下一篇 2021年9月6日 下午10:00


相关推荐

  • origin画图数据_origin多元线性回归拟合

    origin画图数据_origin多元线性回归拟合制图完成效果图如下。1.原始数据为真实值与预测值。2.另外两列是制作中间的标准线。优化直线。3.4.对预测值与真实值的图进行优化。5.将标准线图层复制到当前页面,ctrl+C,V就行了。将标准线的网格删除。将线移动到该有的位置即可。对周围的字体大小等修正后即可。…

    2026年2月7日
    5
  • 数据库返回的整型数据被偷换成了字符串类型[通俗易懂]

    数据库返回的整型数据被偷换成了字符串类型

    2022年2月15日
    39
  • Kimi回赞马斯克火箭显幽默摘要

    Kimi回赞马斯克火箭显幽默摘要

    2026年3月18日
    3
  • bp神经网络及matlab实现_bp神经网络应用实例Matlab

    bp神经网络及matlab实现_bp神经网络应用实例MatlabBP神经网络通俗教程(matlab实现方法)黑色字体可看可不看,是帮助理解所用红色字体是比较重要的部分,必看BP神经网络是什么BP(Back-propagation,反向传播)神经网络是最传统的神经网络。当下的各种神经网络的模型都可以看做是BP神经网络的变种(虽然变动很大…)。这东西是干什么用的呢?我们在现实中要处理的一切问题映射到数学上只分为两类,可归纳的问题与不可归纳的问题。首先什么是不可归纳的问题,举个例子,你不能用一套完美的数学公式去表达所有的质数,因为目前的研究表明,还没有什么方法

    2025年10月31日
    4
  • java链接生成二维码_java实现滑动验证码源代码

    java链接生成二维码_java实现滑动验证码源代码packagecn.itcast.action;importjava.awt.image.BufferedImage;importjava.io.File;importjava.io.IOException;importjava.io.OutputStream;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;impo…

    2025年9月17日
    11
  • 数仓拉链表[通俗易懂]

    数仓拉链表[通俗易懂]拉链表一丶什么是拉链表拉链表是一种数据模型,主要是针对数据仓库设计中表存储数据的方式而定义的,顾名思义,所谓拉链,就是记录历史。记录一个事物从开始,一直到当前状态的所有变化的信息。拉链表可以避免按每一天存储所有记录造成的海量存储问题,同时也是处理缓慢变化数据的一种常见方式。百度百科的解释:拉链表是维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。二丶拉链表的产生背景在数据仓库的

    2022年10月16日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号