阅读本文需要理解 C++ 变长模板、函数重载等基本操作,可以自行百度别的博客
void eat(int i)
{
cout << "eat " << i << endl;
}
void eat(char c)
{
cout << "eat " << c << endl;
}
// 利用重载完成对不同参数的处理
template<typename T> // 最短的模板已经定义好了,当编译到dinner(T)时就会触发这里的编译
void dinner(T t)
{
eat(t);
}
template<typename T, typename ...Args> // 关键,如何定义变长类型参数
void dinner(T dish, Args... rest_of_the_meal) // 如何把变长类型参数对应到变长函数参数
{ // 这里我认为可以理解为类似 python 的 zip (Args, rest_of_the_meal)
// 即把两个列表(type1, type2...), (arg1, arg2 ...)变成
eat(dish); // type1 arg1, type2 arg2... 的形式
dinner(rest_of_the_meal...); // 触发对短一些的模板的编译
}
测试:
dinner(0, 'a', 'b', 'c', 1);
结果:
eat 0
eat a
eat b
eat c
eat 1
可以看到这样我们就可以对不同类型的函数参数进行处理,比起 C 的 实现方式来看,我们利用了原生的类型系统对不同类型的参数进行了处理,写起来比较方便和安全