【问题标题】:Wrappers for ATL containers so they can be used with std:: container templates?ATL 容器的包装器,以便它们可以与 std:: 容器模板一起使用?
【发布时间】:2020-11-19 12:30:57
【问题描述】:

是否有像 CSimpleArray 这样的 ATL 容器的“包装器”,以便它们可以与适用于容器的标准模板一起使用?

例如,我正在考虑创建一个 CSimpleArraySTD 模板,该模板将在构造函数中获取 CSimpleArray 引用,然后提供一些标准调用。即开始(),结束(),空(),大小()......然后你可以有这样的代码:

CSimpleArray myClassArray;

for(auto &item: CSimpleArraySTD(myClassArray)) { }

对于 CSimpleMap 也是如此。

我们有一堆使用 ATL 容器的代码,但希望能够将它们与现代 C++ 一起使用。

【问题讨论】:

  • 有人想评论为什么这被否决了吗?

标签: c++ atl


【解决方案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 是什么阻止您制作自己的包装器?你所要求的是微不足道的
  • 因为它是另一个需要管理的代码库。有很多容器,我必须测试所有容器。正确地做并非完全微不足道。我还假设可能有一个项目已经完成了这项工作。像这样的项目也会有更多的关注,这意味着不太可能有错误。不过,也许我应该为此创建一个开源库。
猜你喜欢
  • 2020-07-23
  • 2019-12-23
  • 1970-01-01
  • 1970-01-01
  • 2019-10-29
  • 2022-01-18
  • 1970-01-01
  • 2022-12-03
  • 2011-06-05
相关资源
最近更新 更多