下面是一个可变参数模板日志类的例子,示例代码中定义了一个名为Logger的类模板,它接受任意数量和类型的参数,并将它们格式化为可读的消息字符串,然后将它们写入日志文件。
#include <iostream>
#include <fstream>
#include <iomanip>
#include <string>
#include <ctime>
#include <sstream>
class Logger {
public:
explicit Logger(const std::string& filename) {
m_file.open(filename, std::ios::out | std::ios::app);
}
~Logger() {
m_file.close();
}
template <typename... Args>
void log(const char* level, Args... args) {
auto now = std::time(nullptr);
auto tm = *std::localtime(&now);
std::ostringstream oss;
oss << "[" << std::put_time(&tm, "%Y-%m-%d %H:%M:%S") << "] [" << level << "] ";
format(oss, args...);
oss << "\n";
m_file << oss.str();
}
private:
std::ofstream m_file;
template <typename T>
void format(std::ostringstream& oss, T value) {
oss << value;
}
template <typename T, typename... Args>
void format(std::ostringstream& oss, T value, Args... args) {
format(oss, value);
format(oss, args...);
}
};
int main() {
Logger log("test.log");
log.log("INFO", "This is a test log message.");
log.log("WARNING", "The value of pi is approximately ", 3.14159);
log.log("ERROR", "Failed to open file: ", "test.txt");
return 0;
}
在这个示例中,我们首先定义了一个名为Logger的类模板,它有一个模板参数包,其中包含各种参数类型和数量。然后,我们定义了一个名为log的可变参数模板函数,它接受一个表示消息级别的字符串以及任意数量和类型的参数。这个函数使用现有的C++库函数(如std::time和std::put_time)获取当前时间并将其作为字符串的一部分打印到日志消息中。然后,它使用ostringstream实例格式化传递的所有参数,并将结果附加到日志文件中。最后,我们在main函数中使用这个日志记录器记录三条不同的日志消息,每个消息都有不同数量和类型的参数。
本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议。转载请注明来自 张拓的博客!