编程冷知识
标签:std,...,知识,args,编程,参数,ostream,os From: https://www.cnblogs.com/ziyuemeng/p/17818237.html
qt中只修改宏,不修改其它东西,编译运行还会时原先的结果,必须手动强制重新编译。
c++中ostream删除了拷贝构造和复制构造,是为了避免两个ostream同时向一个输出流输出数据。如果想使用std::cout将内容输出到终端,可以写成ostream& os = std::cout;如果想将信息记录到文件中,可以轻而易举的改写。
void LogInfo(ostream& os){} template <typename T, typename... Args> void LogInfo(ostream& os,T&& t,Args&&... args) { os << std::forward<T>(t)<<" "; LogInfo(os, args...); } template <typename... Args> void LogInfo(Args&&... args) { //ostream& os = std::cout; // 将输出流输出到标准输出。 ofstream file("MMMMMMMZY.txt"); ostream& os= file; // LogInfo(os,args...); // LogInfo(os,std::forward<Args>(args)...); }
参数包展开的区别
- args...
- 参数包中的参数会按照原样展开,没有进行任何类型转换。这种展开方式适用于不需要对参数进行类型转换的情况。
- std::forward
(args)...
- std::forward是一个模板函数,它根据参数的类型推导出适当的左值引用或右值引用,如果参数是左值,它们将被转换为左值引用;如果参数是右值,它们将被转换为右值引用。这样保持参数的值类别和常量性。
用args...进行参数包展开时,按照原始类型进行传递,不进行值类别和常量性的转换。而std::forward会根据参数的左值/右值属性进行类型转换。
#define LOG_INFO(...) LogInfo("file: ",FILE,", function: ", FUNCTION, ", line: ",LINE,##VA_ARGS)
...
表示可变参数的占位符。##
运算符用于处理可变参数为空的情况,它的作用是在可变参数为空时将前面的逗号去除。__VA_ARGS__
是可变参数的使用方式,它允许宏接受不定数量的参数。