我尝试为可以附加到我的对象的posible元数据创建一个容器。我可以保证每类最多只有一个对象附加到我的班级,但是对于不同类型的对象没有限制。例如,我无法将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
专门定义了一些较少的类,并将它作为map类的第三个模板参数传递,如下所示: / p>
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
课程?
答案 0 :(得分:5)
回答一个古老问题的道歉,但这是谷歌在我试图解决这个问题时的第一个结果。您应该使用std::type_index
包装类作为地图的关键字,而不是创建包装类。
答案 1 :(得分:3)
为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
作为地图中的密钥。