这是实际代码的简化实例。目标是通过基于范围的循环提供对容器元素的访问但是在不暴露变化的情况下,动态地更改元素(这里是平方的)。
代码有效,但似乎过于复杂和难以理解。我错过了什么简化?
#include <vector>
#include <iostream>
using ivec_t = std::vector<int>;
class A {
ivec_t vec;
public:
A(const ivec_t& v) : vec(v) {}
class sq_class {
class iter {
ivec_t::iterator ivit;
public:
iter(ivec_t::iterator the_ivit) : ivit(the_ivit) {}
bool operator!=(const iter& other) { return ivit != other.ivit; }
iter& operator++() { ++ivit; return *this; }
int operator*() { return (*ivit)*(*ivit); } // <-------------------
};
ivec_t ivec;
public:
sq_class(ivec_t& the_ivec) : ivec(the_ivec) {}
iter begin() { return iter(ivec.begin()); }
iter end() { return iter(ivec.end()); }
};
sq_class squares() { return sq_class(vec); }
};
main()
{
A a({1,2,4});
// expected output: 1, 4, 16,
for (auto item : a.squares())
std::cerr << item << ", ";
std::cerr << "\n";
}