是否应在命名空间"std"内重载"begin"和"end"函



最近我一直在开发一个使用MFC和对象(如CArray<T, U>(的代码库。

新代码的某些部分使用了STL和<algorithm>库。

例如

CArray<int int> carray;
carray // do stuff
std::vector<int> stlvector(begin(carray), end(carray));
stlvector.dostuff() // do stuff

我最近问了一个关于为CArray之类的类创建迭代器的问题,我无法访问它

我现在对此还有一些进一步的问题。这是我的第一个问题:

  • beginend函数应该在std命名空间内吗

我将单独询问其他问题,并很快提供链接,在这些链接可用时替换这行文本。

查看begin:的非平凡使用可能很有用

CArray<int> carray;
for (auto c : carray){
}

begin隐藏在循环的范围内!这是哪个begin(carray)?此处的名称查找规则表示只执行参数相关的查找。没有试图查看std::begin,因为stdCArray根本不相关。

这是有道理的。CArrayIterator begin(CArray)是属于CArray的函数,因此应该在同一个命名空间中。

若要正确定义函数,应将其定义在与CArray相同的命名空间中。为了正确地通用它,它应该像两步交换习惯用法一样使用:

{
using std::begin;
begin(my_carray);
}

您可以考虑使用一些可以封装CArray的C++20功能,例如std::spanstd::ranges::view_interface

最新更新