Как создать контейнер, который принимает один объект каждого вида? - PullRequest
2 голосов
/ 21 июня 2011

Я попытался создать контейнер для возможных метаданных, которые можно прикрепить к моим объектам.Я могу гарантировать, что будет не более одного объекта каждого вида, присоединенного к моему классу, но нет ограничений на присоединение объектов другого типа.например, я не могу прикрепить два экземпляра wordInfo к объекту, но экземпляры классов wordInfo и phraseInfo могут быть присоединены к объекту одновременно.вот что я сделал до сих пор, чтобы сделать это.

class object
{
    std::map <std::type_info, object*> mMetaData;
    public:
    inline void attachMetaData(object* pData)
    {
        mMetaData[typeid(*pData)] = pData;
    }
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, T*>::type getMetaData()
    {
        if (mMetaData.find(typeid(T)) == mMetaData.end())
            return NULL;
        else
            return mMetaData[typeid(T)];
    }
    template <class T> inline std::enableif<std::is_base_of<object,T>::value, void>::type detachMetaData()
    {
        mMetaData.erase(typeid(T));
    }
}

в приведенном выше коде произошла ошибка компиляции: оператор меньше был не определен для std::type_info, поэтому я определил немного меньше класса специально для std::type_info ипередайте его в качестве третьего параметра шаблона класса карты следующим образом:

struct typeinfoless
{
    bool operator()(std::type_info& left, std::type_info& right)
    {
        return left.hash() < right.hash();
    }
}
std::map <std::type_info, object*, typeinfoless> mMetaData;

, но затем я столкнулся с другой ошибкой, которую я не знаю, как ее исправить, std::type_info имеет приватный конструктор и даже конструктор приватной копии,поэтому я даже не могу извлечь из этого какой-то класс.Любая идея, как я могу решить эту проблему?или любой другой возможный способ создать мой object класс?

Ответы [ 2 ]

5 голосов
/ 06 октября 2012

Извиняюсь за ответ на древний вопрос, но это был первый результат в Google, когда я попытался выяснить это.Вместо создания класса-оболочки вы должны использовать класс-оболочку std::type_index в качестве ключа вашей карты.

3 голосов
/ 21 июня 2011

Создайте класс-оболочку для std :: type_info, аналогично следующему:

class TypeWrapper
{
    private const std::type_info &mInfo;
    public TypeWrapper(const std::type_info &info) : mInfo(info)
    {
    }
    // Functions required by a key into a std::map.
};

Используйте TypeWrapper в качестве ключа для вашей карты.

...