c++ - 如何将 C 类型可变参数转换为 C++ 样式可变参数类型?

我有一个目前看起来像这样的函数:

void log(uint8_t level, const char* fmt, ...) {
    va_list va;
    va_start(va, fmt);
    char msg[128];
    int  msg_size = vsnprintf(msg, 128, fmt, va);
    va_end(va);
    callback->dosomething(level, msg); // some api
}

我想把它转换成,

void log(uint8_t level, const char* fmt, Args... args) {
    va_list va;
    va_start(va, fmt);
    char msg[128];
    int  msg_size = vsnprintf(msg, 128, fmt, va); // do some things similar here with args
    va_end(va);
    callback->dosomething(level, msg); // some api
}

有人可以帮我吗?

最佳答案

这是一种方法:

template<class... Args>
void log(uint8_t level, const char* fmt, Args&&... args) {
    char msg[128];
    int  msg_size = std::snprintf(msg, 128, fmt, std::forward<Args>(args)...);
    callback->dosomething(level, msg); // some api
}

请注意,我使用的是 snprintf 而不是 va_list 特定的 vsnprintf

Demo

https://stackoverflow.com/questions/68627831/

相关文章:

c++ - 来自具有大小的 char * 缓冲区的双向迭代器

python - Django UUIDField 默认值

python - 正则表达式匹配尽可能少的字符

typescript - 如何在 TypeScript 中有选择地将属性从一个对象复制到另一个对象

c++ - C++二维数组的访问效率

python - 在列表和元组列表之间查找公共(public) id

python - 如何创建嵌套列表并在每个嵌套中放置特定数量的元素?列表和它的嵌套元素总是不一样的

angular - 如何以 Angular 重置表单组?

r - 如何过滤列中包含少于 3 个空格的行? (右)

javascript - 我如何在 Next.js 中删除 ID 为 ="__next"的 div