В настоящее время я пишу код 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 ^ при вставке)?
Вы не можете разыграть Vector<Object^>
к любому другому Vector<>
потому что между ними нет наследства. Единственное, что вы можете сделать, это привести каждый элемент в правильный класс. Итак, если вы хотите Vector<SpecificType^>
вам действительно нужно создать его заново. Не то чтобы это слишком сложно
Vector<SpecificType^> specificList;
for (Object^ p : myList)
specificList.push_back(static_cast<SpecificType^>(p));
Других решений пока нет …