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