Приведение из одного шаблонного контейнера в другой

В настоящее время я пишу код WinRT, но я думаю, что этот вопрос относится ко всему C ++. При взаимодействии с пользователем платформа вызывает одну из моих функций, передавая вектор с общими указателями Object ^ (очень похоже на void * для тех, кто не является WinRT). Я уже знаю, какой тип объектов находится в векторе, и я хотел бы привести вектор к этому типу объектов.

Пример:

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 ^ при вставке)?

0

Решение

Вы не можете разыграть Vector<Object^> к любому другому Vector<> потому что между ними нет наследства. Единственное, что вы можете сделать, это привести каждый элемент в правильный класс. Итак, если вы хотите Vector<SpecificType^> вам действительно нужно создать его заново. Не то чтобы это слишком сложно

Vector<SpecificType^> specificList;
for (Object^ p : myList)
specificList.push_back(static_cast<SpecificType^>(p));
1

Другие решения

Других решений пока нет …