如何创建一个容器,其中每种对象都有一个

how to create a container that takes one object of each kind?

本文关键字:对象 有一个 创建 何创建 一个      更新时间:2023-10-16

我试图为可以附加到我的对象的可能元数据创建一个容器。我可以保证每种类型最多有一个对象附加到我的类中,但不同类型的对象附加没有限制。例如,我不能将wordInfo的两个实例附加到对象,但wordInfophraseInfo类的实例可以同时附加到对象。以下是我迄今为止所做的事情。

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定义less运算符,所以我专门为std::type_info定义了一些less类,并将其作为映射类的第三个模板参数传递,如下所示:

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类?

很抱歉回答了一个古老的问题,但这是我在谷歌上试图弄清楚的第一个结果。应该使用std::type_index包装器类作为映射的键,而不是创建包装器类。

为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作为进入地图的钥匙。

相关文章: