我有一个使用'...'参数的日志记录函数,并使用vsprintf_s创建最终输出字符串
它工作正常,除了我总是必须使用c_str()来打印字符串
起初我认为这不是问题,但是在每个字符串变量之后添加所有这些.c_str()是很痛苦的,而我却一直忘记它们
我想也许C ++大师可以在这个问题上启发我,有没有办法让我的日志记录功能自己解决这个问题?
void Logger::print(const std::string fmt, ...)
{
va_list args;
int len;
char * buffer;
va_start(args, fmt);
len = _vscprintf(fmt.c_str(), args)+1;
buffer = (char*)malloc(len * sizeof(char));
vsprintf_s(buffer, len, fmt.c_str(), args);
va_end(args);
std::cout << buffer << std::endl;
free(buffer);
}
谢谢
您可以添加两个可变参数包装函数模板,如下所示:
#include <type_traits>
template <class Arg>
decltype(auto) prepare(const Arg& arg)
{
if constexpr (std::is_same_v<Arg, std::string>)
return arg.c_str();
else
return arg;
}
template <class ...Args>
void printWrapper(Args&&... args)
{
Log::print(prepare(std::forward<Args>(args))...);
}
并调用printWrapper
而不是原始成员函数。请注意,我假设Log::print
是静态成员函数。如果不是这样,你需要调整它。这应该现在有效:
const std::string hello("hello");
printWrapper("%d %s %s", 42, hello, "world");
请注意,编译时需要C ++ 17。