как преобразовать cpp typeid(T).hash_code() в type. (с проблемой void * уничтожить функцию)

#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. То есть вы имеете в виду использование виртуальных классов для классов шаблонов? хорошо, я попробую!