我有这个Container类的begin()和end()函数用于c ++ 11 foreach循环:
class Element
{
//content doesn't matter
};
class Container
{
Element* elements;
int size;
/* constructor, destructor, operators, methods, etc.. */
Element* begin() { return elements; };
Element* end() { return elements + size; };
};
Run Code Online (Sandbox Code Playgroud)
这是一个有效的c ++ 11 foreach循环:
Container container;
for (Element& e : container)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
但现在考虑这个foreach循环:
Container container;
for (Element* e : container)
{
//do something
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用foreach循环Element*而不是Element&像这样?
这也有很大的优势,可以防止每次for (Element e : container)都复制元素的键入.
在那种情况下begin(),end()就Element**我所知,必须返回.
但sizeof(Element)不保证是sizeof(Element*)在大多数情况下它们不匹配.递增指针增量的基本类型大小,sizeof(Element)用于递增Element*和sizeof(Element*)递增Element**.
所以前缀operator++()会将指针偏移一个假值,事情变得糟透了.任何想法如何让这个工作?
我同意LRiO的看法,你现在拥有的可能是最好的解决方案.它还与标准容器的运行方式相关联,并且为用户提供最少惊喜的路径始终是最佳途径(除非有令人信服的理由分歧).
也就是说,你当然可以得到你想要的行为:
class Container
{
// ...
struct iterator {
Element* e;
// this is the important one
Element* operator*() { return e; }
// the rest are just boilerplate
iterator& operator++() { ++e; return *this; }
iterator operator++(int) {
iterator tmp{e};
++*this;
return tmp;
}
bool operator==(iterator rhs) const { return e == rhs.e; }
bool operator!=(iterator rhs) const { return e != rhs.e; }
};
iterator begin() { return {elements}; };
iterator end() { return {elements + size}; };
};
Run Code Online (Sandbox Code Playgroud)
您可以考虑从继承std::iterator获取typedef或使用boost::iterator_facade.但这至少可以为您提供功能.
| 归档时间: |
|
| 查看次数: |
3458 次 |
| 最近记录: |