在 MFC CArray 中,使用不同默认模板类型的原因是啥?

Posted

技术标签:

【中文标题】在 MFC CArray 中,使用不同默认模板类型的原因是啥?【英文标题】:In MFC CArray, what are reasons to use different default template type?在 MFC CArray 中,使用不同默认模板类型的原因是什么? 【发布时间】:2011-07-14 08:20:00 【问题描述】:

MFC CArray 类有两个模板参数(来自MSDN):

template < class TYPE, class ARG_TYPE = const TYPE& > 
class CArray
...

ARG_TYPE 的默认参数是const TYPE&amp;,SO 上的一些问题询问何时使用不同于默认的类型(例如Should the ARG_TYPE for a CArray be const & or not 或What's the difference between CArray and CArray ?)。

我现在的问题是:是否存在 ARG_TYPE 不是 TYPEconst TYPE&amp; 的 CArray 的合理用例,例如另一个班级?这些用法的原因是什么?

【问题讨论】:

不是您问题的答案,但请勿使用CArray。这是一个可怕的类,它将使用memcpy 而不是复制构造来复制其元素。因此,如果您使用它来保存包含指针的对象数组,您的应用程序将崩溃。请改用std::vector 我正在寻找不使用 CArray 并说服同事使用 std::vector 的论据,我想知道这个奇怪之处。 CMap 更可怕的是有 4 个模板参数和一种复杂的方法来确定地图中的排序顺序...... 【参考方案1】:

我的猜测是,应该和继承层次有关。

struct B ;
struct D : B ;

CArray<D, const B&> myArray;

您可能希望将基类class 作为接收参数,它可以从派生的class 接收const 引用。

【讨论】:

【参考方案2】:

我最好的例子是CArray &lt;CString, LPCTSTR&gt;。事实上,我记得CArray &lt;CString, CString&amp;&gt; 并没有很好地工作......

【讨论】:

以上是关于在 MFC CArray 中,使用不同默认模板类型的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 中创建“CArray<CArray<CString>>& results”?

MFC CArray类的基本使用

仅将 CString 和 CArray 包含到 C++ 项目中

CArray 和内存预分配

如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?

CTypePtrList