2012-11-05 88 views
0

我目前正在寫WinRT的代碼,但我想這個問題適用於所有的C++。在用戶交互時,框架調用我的一個函數傳遞一個帶有通用對象指針的向量(對於非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)); 
+0

跛腳。我想這解釋了爲什麼我找不到答案。 –

+0

更具體地,不同於C#,C++/CX不支持通用類型的協方差/逆變。無論「T」與「U」之間的關係如何,「矢量」和「矢量」都是不相關的類型。 –

+0

@AndyRich在這種情況下,協方差/逆變不會幫助你,因爲載體通常是一個讀/寫結構。但是在其他模板中,你所說的可以在C#中工作。 – Gorpik