我们知道C++11已经支持了C99的变长宏。变长宏与printf的默契配合使得程序员能够非常容易地派生出printf的变种以支持一些记录。而printf则使用C语言的函数变长参数特性,通过使用变长函数,printf的实现能够接受任何长度的参数列表。不过无论是宏,还是变长参数,都无法获得传递参数的类型。一个变长函数如下:
#include <stdarg.h>
#include <stdio.h>
using namespace std;
double SumofFlot(int count, ...)
{
va_list ap;
double sum = 0;
va_start(ap, count); //获得变长列表的句柄ap
for (int i = 0; i < count; ++i)
{
sum += va_arg(ap, double); //每次获得一个参数
}
va_end(ap);
return sum;
}
int main()
{
printf("%f\n", SumofFlot(3, 1.2f, 3.4, 5.6));
}
运行结果:
10.200000
变长函数的可能的实现方式
缺点:变长函数这种实现方式,对于C++这种强调类型的语言来说相当于开了一个“不规范”的后门。C++需要引入一种更为“现代化”的变长参数的实现方式,即类型和变量同时能够传递给变长参数的函数,一种好的方式是充分利用C++的函数模板。具体参考下一篇博文。