如何创建一个容器,每个对象一个?

Ali*_*232 2 c++ stl generic-programming typeid typeinfo

我试图为可以附加到我的对象的可能元数据创建一个容器.我可以保证每类最多只有一个对象附加到我的班级,但是对于不同类型的对象没有限制.例如,我不能将两个实例附加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));
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码有一个编译错误:没有定义更少的运算符std::type_info所以我专门定义了一些较少的类std::type_info,并将它作为map类的第三个模板参数传递,如下所示:

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;
Run Code Online (Sandbox Code Playgroud)

但后来我遇到了另一个错误,我不知道如何解决,std::type_info有私有构造函数甚至私有拷贝构造函数,所以我甚至无法从中派生出一些类.任何想法如何解决这个问题?或任何其他可能的方式来创建我的object课程?

and*_*asm 6

回答古老问题的道歉,但这是谷歌在我试图解决时的第一个结果.您应该使用std::type_index包装器类作为映射的键,而不是创建包装器类.