我想创建一个容器类,它应该允许通过 for each 循环进行迭代,但只能通过 for each 循环。我不想授予对其 .begin() 和 .end() 方法的访问权限。
这样的事情是否可能,也许是通过 std::begin 和 std::end 方法的重载和友谊?
我做了一些尝试,其中一个看起来像下面这样。不过,编译器总是抱怨 .begin() 和 .end() 的隐私。
namespace std {
MyIter begin (MySealedContainer&);
MyIter end (MySealedContainer&);
}
class MyIter {
// ...
};
class MySealedContainer {
friend MyIter std::begin (MySealedContainer&);
friend MyIter std::end (MySealedContainer&);
private:
MyIter begin();
MyIter end();
// ...
};
// ---
MyIter std::begin (MySealedContainer& c) {
return c.begin();
}
MyIter std::end (MySealedContainer& c) {
return c.end();
}
即使使用私有 .begin() 和 .end(),我也必须能够执行以下操作:
MySealedContainer foo;
// Insert elements...
for (auto& each: foo) {
// Do something with each.
}