C++变长参数

384 阅读2分钟

在 C++ 中,处理变长参数列表通常涉及两种技术:C 风格的可变参数列表和 C++11 引入的变参模板。下面是每种技术的示例:

1. C 风格的可变参数列表

C++ 支持 C 语言中的 stdarg.h 头文件,允许使用 va_listva_startva_argva_end 宏来操作可变数量的参数。这种方法通常用于兼容 C 代码或处理未知类型的参数列表。

#include <iostream>
#include <cstdarg>

void printNumbers(int count, ...) {
    va_list args;
    va_start(args, count);

    for (int i = 0; i < count; ++i) {
        int value = va_arg(args, int);
        std::cout << value << " ";
    }

    va_end(args);
}

int main() {
    printNumbers(5, 1, 2, 3, 4, 5); // 输出: 1 2 3 4 5
    return 0;
}

2. 变参模板

C++11 引入了变参模板,它允许创建接受任意数量和任意类型参数的函数模板。这是一种更为现代和类型安全的方法,用于处理变长参数列表。

#include <iostream>

// 基本情况:当没有参数时,什么都不做
void print() {}

// 递归展开参数包
template <typename T, typename... Args>
void print(T first, Args... args) {
    std::cout << first << " ";
    print(args...); // 递归调用,处理剩余的参数
}

int main() {
    print(1, 2.5, "three", '4'); // 输出: 1 2.5 three 4
    return 0;
}

在这个例子中,print 函数模板使用了递归展开技巧来处理每个参数。当参数包 args 为空时,递归调用结束。

总结

  • C 风格的可变参数列表:适用于需要兼容 C 代码的场景或处理未知类型的参数列表。不过,这种方法缺乏类型安全。

  • 变参模板:是一种更现代的技术,提供了更好的类型安全和灵活性。它允许处理不同类型的任意数量的参数。

根据具体需求和代码的上下文,可以选择最合适的方法来实现变长参数的处理。