在 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&
,SO 上的一些问题询问何时使用不同于默认的类型(例如Should the ARG_TYPE for a CArray be const & or not 或What's the difference between CArray and CArray ?)。
我现在的问题是:是否存在 ARG_TYPE 不是 TYPE
或 const TYPE&
的 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 <CString, LPCTSTR>
。事实上,我记得CArray <CString, CString&>
并没有很好地工作......
【讨论】:
以上是关于在 MFC CArray 中,使用不同默认模板类型的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MFC 中创建“CArray<CArray<CString>>& results”?
仅将 CString 和 CArray 包含到 C++ 项目中