C++ 利用变长模板生成类型安全的变参函数

阅读本文需要理解 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 的 实现方式来看,我们利用了原生的类型系统对不同类型的参数进行了处理,写起来比较方便和安全

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章