c++11变参模板的展开

来源:互联网 发布:nginx部署webpack项目 编辑:程序博客网 时间:2024/06/05 19:24

有时候我们需要单独操作变参模板的每一个参数,这时候就需要变参模板的展开。比如序列化反序列化,脚本语言绑定时的传参等,本文介绍变参模板展开的3种常用方式。

1. 递归法

template <typename Arg1>void expand(Arg1 arg1){    std::cout << arg1;}template <typename Arg1, typename... Args>void expand(Arg1 arg1, Args... args){    std::cout << arg1;    expand(args...);}int main(){    expand("hello", "world", 1, 2, 3);    return 0;}

通过一个分离第一个变参实现,这也是最常用的一种方式。
输出:helloworld123

2. 数组法

template<typename ARG>int doprint(ARG arg){    std::cout << arg;    return 0;}template <typename... Args>void expand(Args... args){    int _tmp[] = { doprint(args)... };}int main(){    expand("hello", "world", 1, 2, 3);    return 0;}

通过一个临时数组的初始化来实现变参的展开。
输出:helloworld123

3. 辅助函数法

template<typename ARG>int doprint(ARG arg){    std::cout << arg;    return 0;}template <typename... Args>void doexpand(Args... args){   }template <typename... Args>void expand(Args... args){    doexpand(doprint(args)...);}int main(){    expand("hello", "world", 1, 2, 3);    return 0;}

和数组法类似,通过一个辅助函数来实现参数的展开,有一点需要注意,它对参数的遍历是倒序的,也就是先访问最后一个参数,最后访问第一个参数
输出:321worldhello

0 0
原创粉丝点击