使用现代 C++ 实现的可变参数函数

有时候我们需要定义一种可变参数的函数,如同 Mathematica 中的 Plus 函数,在这个函数中,我们可以输入任意正整数个变量,然后它会返回这些量的算术和,示例如下:

In[1]:= Plus[1, 2, 3, 4, 5]
Out[1]:= 15

显然这样的函数大有用处,那么如何使用 C++ 来实现这样的功能呢?答案是使用可变参数模板。

1. 函数的定义

具体的函数定义方式如下:

template<typename... T>
fun(T... args) {
    // define
}

这样我们就定义了一个可以输入任意类型任意个数的变量做为函数 fun 的实参。我们可以使用 sizeof...(args) 来获取输入参数的个数。

2. 参数的解析

参数的解析主要有两种方式:1. 基于范围的 for 循环;2. 递归调用。示例如下:

2.1 基于范围的 for 循环解析可变参数包

template<typename... T>
fun(T... args) {
    for (auto x : {args...}) {
         Do_something(x);
    }
}

2.2 递归调用[1]

// 用于终止迭代的基本函数
template <typename T>
void setVector(T arg) {
    vector.emplace_back(arg);
}

// 可变参数函数模板
template <typename T, typename... Args>
void setVector(T arg, Args... args) {
    setVector(arg);
    setVector(std::forward<Args>(args)...);
}

一个完整的示例代码如下:

#include <iostream>
#include <vector>

using namespace std;

class Example {
private:
    vector<double> Vec;

public:
    template <typename T>
    void setVector(T arg) {
        Vec.emplace_back(arg);
    }

    template <typename T, typename... Args>
    void setVector(T arg, Args... args) {
        setVector(arg);
        setVector(std::forward<Args>(args)...);
    }

    void printVector() {
        for (auto _ : Vec) {
            cout << _ << '\t';
        }
        cout << '\n';
    }
};

int main() {
    Example a;
    a.setVector(1.2, 2.3, 3.6, 4.6, 6.9);
    a.printVector();
}

编译并运行输出的结果如下:

1.2     2.3     3.6     4.6     6.9

  1. https://zhuanlan.zhihu.com/p/56242617 可变参数模板

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 3,179评论 2 9
  • 前言 将程序分成适当的自包含单元是开发任意程序的基本方式。在开发时,应该将其分成多个便于管理的部分,这样带来的好处...
    seraphzxz阅读 1,554评论 0 48
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,687评论 1 32
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    呼呼哥阅读 3,717评论 0 1
  • 函数参数的默认值 基本用法 在ES6之前,不能直接为函数的参数指定默认值,只能采用变通的方法。 上面代码检查函数l...
    陈老板_阅读 520评论 0 1

友情链接更多精彩内容