struct exp_smoothing {
    float alpha; // smoothing parameter (1 = identity mapping)
    float last;  // state
 
    float operator()(float x) {
    	return last += (x - last) * alpha; 
    }
};

template<class Filter, class Iterator>
Filter apply_inplace(Filter flt, Iterator beg, Iterator end) {
    while (beg != end) {
        *beg = flt(*beg);
        ++beg;
    }
    return flt;
}

#include <iostream>
#include <vector>
 
int main() {
    std::vector<float> signal = {0,1,2,3,4,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6};
    exp_smoothing flt = {
        0.5f, // alpha
        0.0f  // last
    };
    flt = apply_inplace(flt,signal.begin(),signal.end());
    for (float x : signal) {
    	std::cout << x << '\n';
    }
}
