gpt4 book ai didi

c++ - 查找可变参数列表的字符串格式说明符

转载 作者:行者123 更新时间:2023-11-28 01:34:12 24 4
gpt4 key购买 nike

我有调用记录器 (spdlog) 方法的日志函数:

template<typename... Args>
void Log(const char* fmt,
const Args&... args)
{
g_FileLogger->log(fmt, args...);
}

我想将我的记录器(spdlog,由 g_FileLoggre 表示)更改为另一个记录器。不幸的是,“fmt”字符串包含“{}”,它是变量“args”的占位符。我想通过正确的格式说明符(%s、%zu、%d 等...)更改那些“{}”,就像其他记录器一样,我必须指定正确的格式说明符。

你能给我一个快速安全的解决方案来生成一个字符串,用正确的变量格式说明符替换“{}”吗。

否则,spdlog 是一个很棒的日志记录 API,但由于它的 API 已被破坏,我们决定选择另一个记录器,例如在 Centos 中 API 是旧的,而在 Gentoo 中它是更新的并且代码将无法编译。

最佳答案

创建一个format_converter 函数

template<typename... Args>
std::string format_converter(const char* fmt,
const Args&... args)
{...}

解析fmt字符串并根据参数进行转换。

然后修改你的函数:

template<typename... Args>
void Log(const char* fmt,
const Args&... args)
{
auto new_fmt = format_converter(fmt, args...);
new_logger->log( new_fmt, args... );
}

编辑:

format_converter中,可以使用模板函数将参数类型转换为字符串。例如:

template< typename T >
const char* type_string( const T ); // primary template


const char* type_string( const char* ) // overload for c-string
{
return "%s";
}

template<>
const char* type_string< double >( const double ) // partial specialization for double
{
return "%d";
}

template<>
const char* type_string< int >( const int ) // partial specialization for int
{
return "%i";
}

// .....

关于c++ - 查找可变参数列表的字符串格式说明符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50060941/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com