C++ 如何创建一个容器,它接受每种类型的一个对象?

C++ 如何创建一个容器,它接受每种类型的一个对象?,c++,stl,generic-programming,typeid,typeinfo,C++,Stl,Generic Programming,Typeid,Typeinfo,我试图为可附加到我的对象的可能元数据创建一个容器。我可以保证每种类型的对象最多只能有一个附加到我的类中,但不同类型的对象的附加没有限制。例如,我不能将wordInfo的两个实例附加到一个对象,但是wordInfo和phraseInfo类的实例可以同时附加到一个对象。以下是我到目前为止所做的工作 class object { std::map <std::type_info, object*> mMetaData; public: inline void att

我试图为可附加到我的对象的可能元数据创建一个容器。我可以保证每种类型的对象最多只能有一个附加到我的类中,但不同类型的对象的附加没有限制。例如,我不能将
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创建包装类,如下所示:

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

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

中的讨论可能会更详细approriate@cubbi:似乎没有,我得到了哈希函数,这是你标记的问题中的主要问题。我不确定它是VC++实现还是什么,但type_info有散列函数,我可以很容易地使用它,我的问题是创建一个以type_info为键的映射类,因为我得到了一个错误type_info::type_info不可访问。@cubbi:关于您的第一个建议,似乎我可以用它来解决我的问题,但是它并没有给出一个建议,如何在C++中使用标准的STD:Type信息或Type ID对象,它重新定义了RTTI对象本身。@ CuBi: Type ID在第一次讨论中的答案上有一个大的特点:你可以同时调用<代码> Type ID(int)< /C>和<代码> int i;typeid(i),它们都返回相同的内容。我不知道如何使用那里的答案生成。似乎typeid的返回值不是
std::type\u info
,也不是
std::type\u info&
。所以我不能调用
TypeWrapper(typeid(int))
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.
};