编程冷知识

编程冷知识

  1. qt中只修改宏,不修改其它东西,编译运行还会时原先的结果,必须手动强制重新编译。

  2. 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)...);
    }
    
  3. 参数包展开的区别

    • args...
      • 参数包中的参数会按照原样展开,没有进行任何类型转换。这种展开方式适用于不需要对参数进行类型转换的情况。
    • std::forward(args)...
      • std::forward是一个模板函数,它根据参数的类型推导出适当的左值引用或右值引用,如果参数是左值,它们将被转换为左值引用;如果参数是右值,它们将被转换为右值引用。这样保持参数的值类别和常量性。

    用args...进行参数包展开时,按照原始类型进行传递,不进行值类别和常量性的转换。而std::forward会根据参数的左值/右值属性进行类型转换。

  4. #define LOG_INFO(...) LogInfo("file: ",FILE,", function: ", FUNCTION, ", line: ",LINE,##VA_ARGS)

    ... 表示可变参数的占位符。## 运算符用于处理可变参数为空的情况,它的作用是在可变参数为空时将前面的逗号去除。__VA_ARGS__ 是可变参数的使用方式,它允许宏接受不定数量的参数。

posted @ 2023-11-08 20:36  MenciusYue  阅读(28)  评论(0)    收藏  举报