C++ 不定参数详解:实现原理及最佳实践
C++ 中的不定参数是指函数可以接受可变数量的参数。在 C++ 中,可以使用三种方法来实现不定参数:
-
使用 C++11 中的变长参数模板 (Variadic templates)。
-
使用 C 语言中的 va_list、va_start、va_arg 和 va_end 宏。
-
使用 STL 中的可变参数模板 (Variadic templates)。
下面以第一种方法为例进行说明:
使用 C++11 中的变长参数模板
变长参数模板是 C++11 中的新特性,可以在函数模板中使用可变数量的参数。在函数模板中,可以使用递归展开来访问可变数量的参数。
示例代码如下:
#include <iostream>
// 模板函数
template<typename T>
void print(const T& t) // 递归结束条件
{
std::cout << t << std::endl;
}
template<typename T, typename... Args>
void print(const T& t, const Args&... args) // 递归展开
{
std::cout << t << ' ';
print(args...);
}
int main()
{
print(1, 2.0, 'hello', 'a');
return 0;
}
输出结果为:
1 2 hello a
在上面的代码中,我们定义了一个 print 函数模板,它可以接受任意数量的参数。在 print 函数模板的第一个版本中,只有一个参数,这个版本被用作递归结束条件。在第二个版本中,有两个参数:第一个参数是当前需要打印的值,第二个参数是剩余的参数。在第二个版本中,我们先打印当前的值,然后递归调用 print 函数模板,继续打印剩余的参数。
使用变长参数模板时,需要注意以下几点:
-
在函数模板中,必须有一个递归结束条件,否则会编译错误。
-
变长参数模板必须放在参数列表的最后面。
-
可变数量的参数可以是任意类型。
-
可变数量的参数可以被递归展开,以便访问每个参数。
-
可变数量的参数可以通过逗号分隔的方式传递,也可以使用 initializer_list 传递。
原文地址: https://www.cveoy.top/t/topic/mpQ3 著作权归作者所有。请勿转载和采集!