从一个模板化容器投射到另一个
Posted
技术标签:
【中文标题】从一个模板化容器投射到另一个【英文标题】:Casting from one templated container to another 【发布时间】:2012-11-05 07:39:31 【问题描述】:我目前正在编写 WinRT 代码,但我想这个问题适用于所有 C++。在用户交互时,框架调用我的一个函数,传入一个带有通用 Object^ 指针的向量(对于非 WinRT 人员来说,这与 void* 非常相似)。我已经知道向量中有什么类型的对象,我想将向量转换为该对象类型。
例子:
MyClass::SomeFunction(Vector<Object^>^ myList)
// Warning: The following line doesn't work!!
Vector<SpecificType^>^ myTypedList = static_cast<Vector<SpecificType^>^>(myList);
// Here, I go on to interact with the templated vector.
...
编译器不允许我使用 static_cast。 safe_cast 抛出异常。 dynamic_cast 不会抛出异常,而是返回一个空指针。
有没有办法可以转换这个东西,或者我真的必须创建一个新向量并将所有成员复制过来(在插入时将每个成员从 Object^ 转换为 SpecificType^)?
【问题讨论】:
【参考方案1】:您不能将Vector<Object^>
转换为任何其他Vector<>
,因为它们之间不涉及继承。您唯一能做的就是将每个元素转换为正确的类。所以,如果你想要一个Vector<SpecificType^>
,你确实需要重新创建它。并不是说太难:
Vector<SpecificType^> specificList;
for (Object^ p : myList)
specificList.push_back(static_cast<SpecificType^>(p));
【讨论】:
跛脚。我想这解释了为什么我找不到答案。 更具体地说,与 C# 不同,C++/CX 不支持泛型类型协变/逆变。Vector<T>
和 Vector<U>
是不相关的类型,无论 T
和 U
之间的关系如何。
@AndyRich 在这种情况下,协方差/逆变对您没有帮助,因为向量通常是读/写结构。但在其他模板中,您所说的确实可以在 C# 中使用。以上是关于从一个模板化容器投射到另一个的主要内容,如果未能解决你的问题,请参考以下文章