这对我来说似乎工作得很好,即使我使用指针来记住以前的值(在你的情况下这可能是一个好主意,也可能不是一个好主意)。
#include <algorithm>
#include <iostream>
#include <vector>
#include <boost/iterator/transform_iterator.hpp>
class delta {
public:
typedef int result_type;
int operator()(const int& i) const {
if(prev) {
const int* tmp = prev;
prev = &i;
return i - *tmp;
} else {
prev = &i;
return i;
}
}
private:
mutable const int* prev = nullptr;
};
int main()
{
std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::for_each(boost::make_transform_iterator(begin(v), delta()),
boost::make_transform_iterator(end(v), delta()),
[](int i) { std::cout << i << std::endl; });
return 0;
}
但是,即使您使用 decltype,它也不适用于 lambda,因为有状态的 lambda 必须标记为可变的,并且您不能像使用可变成员那样隐藏副作用。