上次写过参数包展开和静态断言的使用——Accumulator-CSDN博客,数组是静态定义的,并且递归展开参数包。这里改用动态数组,并且将参数包展开到初始化列表中,成为一个动态数组。
#include <stdio.h>
#include <vector>
using namespace std;class Accumulator {
public:Accumulator(int n);void reset(void);double& operator[](int ii);void add(const vector<double>& b);template <typename... T>void add(T... args);private:vector<double> a;
};int main(void) {Accumulator a(3);//a.add(1);/*C2398 元素“1”: 从“int”转换到“_Ty”需要收缩转换*/a.add(1.5,5.0,3.0);printf("%g %g %g\n",a[0],a[1],a[2]);a.add(7.0,2.5,6.0);printf("%g %g %g\n",a[0],a[1],a[2]);a.add(10.0,20.0);printf("%g %g %g\n",a[0],a[1],a[2]);return 0;
}Accumulator::Accumulator(int n) :a(n,0) {}void Accumulator::reset(void) {a.assign(a.size(),0);
}double& Accumulator::operator[](int ii) {return a[ii];
}void Accumulator::add(const vector<double>& b) {for (int i=0;i<a.size()&&i<b.size();i++)a[i]+=b[i];
}template<typename... T>
void Accumulator::add(T... args) {add(vector<double>{args...});
}