在他最近的一次谈话中,Herb Sutter建议您优先选择container.begin()
以上的免费begin(container)
end(container)
功能模板。我喜欢它,因为这些函数可以提供给所有不带begin()/ end()方法的迭代类型。由于我的大多数域类具有以域语言交谈的接口,并且不使用像begin/end这样的通用名称,现在我可以提供与STL容器兼容的可迭代接口,并且可以为循环提供范围基础,而不会混淆主类接口。 我想知道什么是为我自己的类型提供开始/结束功能的最佳方式。我的第一个想法是以与我使用swap
相同的方式来完成,并在我的类型所在的相同命名空间中编写函数。如何为您自己的类型提供免费的开始/结束功能
namespace My
{
class Book
{
public:
typedef std::vector<Page>::const_iterator PageIterator;
PageIterator FirstPage() const { return begin(pages_); }
PageIterator LastPage() const { return end(pages_); }
private:
std::vector<Page> pages_;
};
Book::PageIterator begin(const Book& b)
{
return b.FirstPage();
}
Book::PageIterator end(const Book& b)
{
return b.LastPage();
}
}
在这里依赖ADL还是应该在std命名空间中可以吗?我认为另一种方式是提供std命名空间的专门化(在std中不允许重载,对吗?)。尤其是关于查找基于范围的循环的最好方法是什么?