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

2019-11-15  本文已影响0人  菜鸟No1

有时候我们需要定义一种可变参数的函数,如同 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 可变参数模板

上一篇 下一篇

猜你喜欢

热点阅读