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,它将引用 CSimpleArray 并添加函数比如开始、结束、空、push_back 等。这样你可以使用如下语句:for(auto &item: CSimpleArraySTD(mySimpleArray)) @bpeikes 是什么阻止您制作自己的包装器?你所要求的是微不足道的 因为它是另一个需要管理的代码库。有很多容器,我必须测试所有容器。正确地做并非完全微不足道。我还假设可能有一个项目已经完成了这项工作。像这样的项目也会有更多的关注,这意味着不太可能有错误。不过,也许我应该为此创建一个开源库。

以上是关于ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

第12课 std::bind和std::function_std::function可调用对象包装器

BSTR 到 std::string (std::wstring) 反之亦然

[C++11]可调用对象包装器function

C++ std::ref() 函数使用详解

std::function与std::bind

std::function与std::bind