前言
在 C++ 中,有时我们在写一个函数时并不知道参数的数量和类型,这时需要用到不定参数,模板函数。
正文
不定参数
不定参数怎么表示?
对于不定参数的表示,就是三个点,注意是英文的点
...
那么我们在正常使用时函数参数写成这样
funtionType funtionName(typename xxx,...){xxxx; // (函数体)
}
其中 typename 与右面不定参数列表的类型相同。如果不定参数前有多个确定类型的参数,那么不定参数类型与最后一个确定类型的参数的类型一样。
那么怎么获取不定参数呢?
获取不定参数需要一个头文件
#include
获取不定参数大概分为如下几步
(1)定义 va_list
(2)把 va_list 与可变参数表绑定
(3)获取参数并对参数进行想要的操作
(4)结束参数的获取
代码如下
void test(int count,...)
{va_list v; //定义va_listint value; //用于获取值va_start(v,count); //使v跟可变参数表绑定value = va_arg(v, int); //获取可变参数表的参数va_end(v); //结束参数的获取
}
那么就来写一个函数,打印出所有的参数
void showArg(int count,...){va_list ap;va_start(ap,count);cout<<"va_list: ";for (int i=0;i
模板函数
刚才是不知道参数数量,那现在不知道参数类型怎么办?
这样就要用模板函数,书写格式如下
template
函数可以这样写
T1 sum(T1 a, T2 b)
{return (a+b);
}
这样不管是 int float double 还是其他类型,都可以使用这个函数,不需要每个类型都单独写一个函数,降低代码重复性。
模板类
顾名思义,模板类的意思和模板函数差不多,这里面最好的例子就是 cout 和 printf,但是 cout 涉及到了对于 ”<<“符号的处理,这里暂时不讲。printf 可以打印任何类型的变量,那我们就自己写一个 printf。注:printf 肯定还有更底层的函数,这里暂不涉及。(因为你会发现根本看不懂
我直接给出代码
class print{
public:templatestaticvoid cppprintf(FIRST first, PACK... params){cout << first;cppprintf(params...);}templatestaticvoid cppprintf(T end){cout << end << endl;}
};
这里我定义了一个 print 类来写函数。首先我们这里定义了一个模板,中间 `...`是我们一开始说的不定参数,下面 cppprintf 函数用了刚才定义的不定模板参数,然后逐个输出,输出完一个就调用自己(递归)输出下一个。下面的是单个参数的情况,直接输出就行。
最后
那么到这里你就掌握了以上知识点,最近也是消失了几个周,其实是去参与了 Developers-Union 的开发,那整篇文章也就结束了,拜拜~