Я попытался создать контейнер для возможных метаданных, которые можно прикрепить к моим объектам. Я могу гарантировать, что к моему классу будет прикреплено не более одного объекта каждого типа, но нет ограничений на присоединение объектов разных типов. например, я не могу присоединить два экземпляра 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));
}
}
в приведенном выше коде была ошибка компиляции: оператор less не был определен для std::type_info
, поэтому я определил класс less специально для 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
?
typeid(int)
иint i; typeid(i)
, и они оба возвращают одно и то же. который я не знаю, как сгенерировать, используя ответ там. - person Ali1S232   schedule 21.06.2011