2013-05-12 3 views
0

Я сегодня борюсь с этой темой. Я попытался использовать Vectors, IVectors и Arrays.Возможно ли создать массив массивов в WinRT с C++/CX?

Arrays не может иметь более высокое измерение, чем 1 в WinRT, Vectors, по-видимому, невозможно использовать в публичном контексте. (Если вы можете сказать мне, пожалуйста, сделайте это!) И IVectors - это интерфейсы, поэтому вы не можете сделать IVectorIVectors.

Есть любого, и я имею в виду любой способа сделать реальный двумерный массив или массив массивов, как это было возможно в C++/CLI?

(И да, я знаю, что может имитировать 2 размеров с одномерным массивом, но я не хочу, чтобы сделать это.)

+0

Используйте типы, доступные для вас на C++. –

+0

после многих исследований я обнаружил, что есть ключевое слово internal, что позволяет мне использовать типы STL в каком-то общественном контексте. так что, наконец, @HansPassant ваш ответ на самом деле решил мою проблему, несмотря на то, что это был не ответ на вопрос. – iFreilicht

+0

Можете ли вы объяснить, как вы можете использовать «внутренний» в winrt для использования типов STL –

ответ

2

Я использовал этот обходной путь для этой проблемы. Не красиво, но функционально.

Вместо того, чтобы создавать вектор векторов, создайте вектор объектов. Затем используйте safe_cast для доступа к Vectors внутри вашего содержащего Vector.

Platform::Collections::Vector<Object^ >^ lArrayWithinArray = ref new Platform::Collections::Vector<Object^ >(); 

//Prepare some test data 
Platform::Collections::Vector<Platform::String^>^ lStrings = ref new Platform::Collections::Vector<Platform::String^>(); 
lStrings->Append(L"One"); 
lStrings->Append(L"Two"); 
lStrings->Append(L"Three"); 
lStrings->Append(L"Four"); 
lStrings->Append(L"Five"); 

//We will use this to show that it works 
Platform::String^ lOutput = L""; 

//Populate the containing Vector 
for(int i = 0; i < 5; i++) 
{ 
    lArrayWithinArray->Append(ref new Platform::Collections::Vector<String^>()); 

    //Populate each Vector within the containing Vector with test data 
    for(int j = 0; j < 5; j++) 
    { 
     //Use safe_cast to cast the Object as a Vector 
     safe_cast<Platform::Collections::Vector<Platform::String^>^>(lArrayWithinArray->GetAt(i))->Append(lStrings->GetAt(j)); 
    } 
} 

//Test loop to verify our content 
for(int i = 0; i < 5; i++) 
{ 
    for(int j = 0; j < 5; j++) 
    { 
     lOutput += lStrings->GetAt(i) + L":" + safe_cast<Platform::Collections::Vector<Platform::String^>^>(lArrayWithinArray->GetAt(i))->GetAt(j) + ", "; 
    } 
} 
+0

Я тестировал это, и он работает красиво! Я думаю, что для маленьких векторов вам не нужно заботиться об эффективности. Решение для моей проблемы было больше похоже на использование векторов STL. В любом случае, это обходное решение кажется приятным, когда вам действительно нужно передавать многомерные векторы через ABI. – iFreilicht