Table of Contents
#custom-toc-container
C++的可变参数
# 可变参数 可变参数(Variadic Parameters, Variadic arguments),使函数可以接收任意数量的实参。 C++使用`...`表示可变参数,且只能放在函数形参列表的末尾(最后一个)。 # 实现变参函数的三种方法 ## 可变参数宏 ### va_list 访问可变参数 va_list 访问`同类型`可变参数。 ```cpp #include
// count 不一定是可变参数的个数; // 这里是做可变参数求和,所以count刚好等于可变参数的个数 int sum(int count, ...) { va_list ap; // 声明一个va_list变量 va_start(ap, count); //初始化,第二个参数为最后一个确定的形参 int sum = 0; for(int i = 0; i < count; i++) sum += va_arg(ap, int); //读取可变参数,第二个参数为可变参数的类型 va_end(ap); //清理工作 std::cout << "sum=" << sum << std::endl; return sum; } ``` ## initializer_list标准库类型 ```cpp #include
template
void print(std::initializer_list
lst) { for(auto &v : lst){ std::cout << v << std::endl; } } // 使用 std::initializer_list
v{1, 2, 3, 4}; print(v); print({7, 8, 9}); print({"a", "hello", "!!"}); ``` ## 可变参数模板 ### 类型一致可变参数模板 ### 类型不一致可变参数模板 ```cpp void print(){} template
void print(T v, Args... args) { std::cout << v << std::endl; print(args...); } ``` C++17新特性: ```cpp template
void print(Args... args) { std::cout << sizeof...(args) << std::endl; // 输出参数个数 (std::cout << ... << args) << std::endl; // 展开参数包 } ```