ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?
Posted
技术标签:
【中文标题】ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?【英文标题】:Wrappers for ATL containers so they can be used with std:: container templates? 【发布时间】:2020-11-19 12:30:57 【问题描述】:是否有像 CSimpleArray 这样的 ATL 容器的“包装器”,以便它们可以与适用于容器的标准模板一起使用?
例如,我正在考虑创建一个 CSimpleArraySTD 模板,该模板将在构造函数中获取 CSimpleArray 引用,然后提供一些标准调用。即开始(),结束(),空(),大小()......然后你可以有这样的代码:
CSimpleArray myClassArray;
for(auto &item: CSimpleArraySTD(myClassArray))
对于 CSimpleMap 也是如此。
我们有一堆使用 ATL 容器的代码,但希望能够将它们与现代 C++ 一起使用。
【问题讨论】:
有人想评论为什么这被否决了吗? 【参考方案1】:大多数标准 C++ 算法都在迭代器范围上运行。 CSimpleArray
没有 C++ 迭代器,但是指向数组元素的原始指针是有效的迭代器,而 CSimpleArray
确实提供对其元素的直接访问,因此您可以为标准 C++ 算法创建合适的指针以用于迭代,例如:
CSimpleArray arr;
...
someStdAlg(arr.GetData() + index, arr.GetData() + index + count);
// ie: someStdAlg(arr.GetData(), arr.GetData() + arr.GetSize());
或者:
CSimpleArray arr;
...
someStdAlg(&arr[index], &arr[index + count]);
// ie: someStdAlg(&arr[0], &arr[arr.GetSize()]);
【讨论】:
这种方法适用于 CSimpleArray,但希望有人为其中一些模板制作包装器,例如 CSimpleArraySTD以上是关于ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
第12课 std::bind和std::function_std::function可调用对象包装器