gpt4 book ai didi

c++ - 如何为您自己的类型提供免费的开始/结束功能

转载 作者:可可西里 更新时间:2023-11-01 16:33:26 24 4
gpt4 key购买 nike

在他最近的一次演讲中,Herb Sutter 建议优先使用免费的 begin(container) end(container) 函数模板,而不是 container.begin() 。我喜欢它,因为可以为所有没有 begin()/end() 方法的可迭代类型提供这些函数。由于我的大多数领域类都有使用领域语言的接口(interface),并且不使用像开始/结束这样的通用名称,我现在可以提供一个与 STL 容器兼容的可迭代接口(interface)和循环的范围基,而不会弄乱主类接口(interface)。我想知道为我自己的类型提供开始/结束功能的最佳方式是什么。我的第一个想法是采用与 swap 相同的方式,并将函数编写在我的类型所在的同一 namespace 中。

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 中重载,对吧?)。尤其是关于查找基于范围的 for 循环的最佳方法是什么?

最佳答案

我会让 ADL 完成它的工作。虽然您可以在 std 命名空间中添加特化,但当您的命名空间中的普通自由函数就足够时,我没有理由这样做。

特别是对于循环的范围,标准规定:

§6.5.4/1 (definition of begin-expr and end-expr):

  • otherwise, begin-expr and end-expr are begin(__range) and end(__range), respectively, where begin and end are looked up with argument-dependent lookup (3.4.2). For the purposes of this name lookup, namespace std is an associated namespace.

关于c++ - 如何为您自己的类型提供免费的开始/结束功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7582937/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com