#c #hash #type-conversion #void-pointers #typeid
#c #хэш #преобразование типа #void-указатели #typeid
Вопрос:
Я создаю какой-то класс менеджера, подобный этому.
#pragma once
#include <iostream>
#include <unordered_map>
using namespace std;
class TestMgr
{
public:
TestMgr() = default;
~TestMgr() {
for (auto iter = m_test.begin(); iter != m_test.end(); )
{
delete iter->second; // void* doesn't call destory function
iter = m_test.erase(iter);
}
}
template<typename T>
T* DoSomething()
{
CObject<T>* someClass = (CObject<T>*)m_test[typeid(T).hash_code()];
if (someClass == nullptr)
{
m_test[typeid(T).hash_code()] = new CObject<T>();
}
return someClass->DoSomething();
}
unordered_map<size_t, void*> m_test;
};
Я хочу сохранить классы ‘Template’ в контейнерах типа ‘unsorted_map’ (не имеет значения для контейнера)
И хотите вызвать функцию уничтожения. Но я сохранял указатели с помощью void*
Поэтому, если я удалю void * , функция уничтожения не будет работать!
Я хочу сохранить типы, чтобы я мог преобразовать обратно в свой собственный тип.
вот так
delete (Ctest*)iter->second;
как я могу преобразовать обратно в свой тип шаблона. Мне нужна помощь, спасибо!
Ответ №1:
Самым простым решением будет виртуальный CObjectBase::~CObjectBase
. Теперь вам больше не нужно void*
.
Комментарии:
1. То есть вы имеете в виду использование виртуальных классов для классов шаблонов? хорошо, я попробую!