如何使用va_arg修改可变参数的值

2022-08-31 00:00:00 c++ variadic-functions
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>

void tag_log(const char *format, ...) {
    va_list ap;
    va_start(ap, format);
    for (int i = 0; i < 4; i++) {
        va_arg(ap, int) += 100; // is wrong?
    }
    va_end(ap);
    va_start(ap, format);
    vprintf(format, ap);
    va_end(ap);
}

int main() {
    tag_log("%d, %d, %d, %d
", 1, 2, 3, 4);
}

由于va_arg返回右值,因此内容不能修改。如何修改变量参数的内容?

预期产量:101、102、103、104

谢谢!


解决方案

va_arg(ap, int) = 100; // is wrong?

是的,这是错误的。va_arg返回右值(不可赋值)。

我建议改为制作可变模板。

#include <cstdio>
#include <utility>

template<class... Args>
void tag_log(const char *format, Args&&... args) {
    ((args += 100), ...); // fold expression
    std::printf(format, std::forward<Args>(args)...);
}

int main() {
    tag_log("%d, %d, %d, %d
", 1, 2, 3, 4);
}

输出:

101, 102, 103, 104

相关文章