如何创建一个容器,其中每种对象都有一个
how to create a container that takes one object of each kind?
我试图为可以附加到我的对象的可能元数据创建一个容器。我可以保证每种类型最多有一个对象附加到我的类中,但不同类型的对象附加没有限制。例如,我不能将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
定义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
作为进入地图的钥匙。
相关文章:
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 有没有办法在同名类 (c++) 中为对象分配一个指针变量
- 我们可以有一个 setter 成员函数作为从 const 对象引用的 const 吗?
- C++是否有一个容器,每个类型最多存储一个对象
- Qt:在一个类中有一个QPainter对象的实例
- 如何让线程等待对象完全破坏?(对象也有一个线程)?
- 让一个名为A的类.传递以下两个对象有什么区别:(a)obj1和(b)obj1()
- 我有一个 Qt 对象的 2d 数组,我已经用值播种了这些对象。如何访问数组中特定对象的值并更改它们?
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- 类有一个自类型的对象
- 是否有一个函数可以显示我创建的类中的对象到 QTextBrowser 中?
- 在堆栈上有一个对象,而不是在函数的整个生命周期内
- 得到错误"left of '.toString' must have class/struct/union",即使 toString 应该有一个合适的对象
- 我有不同的类,我想用这些类中的对象制作一个向量,然后按值对其进行排序
- 你如何断言一个对象在c++中有一个特定的方法
- 有可能在同一个字符序列上有一个类似函数的宏和一个类似对象的宏吗
- C++如果我有一个对象指针,是在堆栈或堆上分配的方法变量
- 有没有一种方法可以为类的每个对象提供一个boost线程
- JsonCpp - 当有一个 json::Value 对象时,我怎么知道它的键名?