最近我一直在开发一个使用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
之类的类创建迭代器的问题,我无法访问它
我现在对此还有一些进一步的问题。这是我的第一个问题:
begin
和end
函数应该在std
命名空间内吗
我将单独询问其他问题,并很快提供链接,在这些链接可用时替换这行文本。
查看begin
:的非平凡使用可能很有用
CArray<int> carray;
for (auto c : carray){
}
begin
隐藏在循环的范围内!这是哪个begin(carray)
?此处的名称查找规则表示只执行参数相关的查找。没有试图查看std::begin
,因为std
与CArray
根本不相关。
这是有道理的。CArrayIterator begin(CArray)
是属于CArray
的函数,因此应该在同一个命名空间中。
若要正确定义函数,应将其定义在与CArray
相同的命名空间中。为了正确地通用它,它应该像两步交换习惯用法一样使用:
{
using std::begin;
begin(my_carray);
}
您可以考虑使用一些可以封装CArray
的C++20功能,例如std::span
和std::ranges::view_interface