实现使用C ++存储任何类型的哈希

时间:2013-01-28 10:33:39

标签: c++ qt

在我正在开发的库中,我有一个类,我想要一个存储任何类型数据的哈希。这是因为使用此库的算法可能希望将特定数据存储在该类的对象中。

该类被称为“ObjectOfInterest”,我使用QT定义了哈希:

QHash<QString, void*> properties;

然后我实现了这个函数来存储信息:

bool ObjectOfInterest::hasProperty(QString prop) const
{
    return properties.contains(prop);
}

template <class T> const T& ObjectOfInterest::getProperty(const QString prop) const
{
    return *(T *)properties.value(prop);
}

template <class T> void ObjectOfInterest::setProperty(const QString prop, T value)
{
    if (hasProperty(prop)) deletePropertyValue<T>(prop);
    properties.insert(prop, new T(value));
}

//private
template <class T> void ObjectOfInterest::deletePropertyValue(const QString prop)
{
    delete (T *)properties.value(prop);
}

现在问题是,当删除“ObjectOfInterest”的对象时,如何删除存储在属性哈希中的所有值?现在我有

ObjectOfInterest::~ObjectOfInterest()
{
    //delete other stuff...

    QHash<QString, void*>::iterator i;
    for (i = properties.begin(); i != properties.end(); ++i)
    {
        delete i.value();
    }
}

但这不是解决方案,因为我没有调用析构函数。任何想法如何做到这一点?

谢谢!

2 个答案:

答案 0 :(得分:1)

因此,我不是使用void*,而是创建一个包装类,可以在其中包含其他对象,或者从同一个基类中创建所有“感兴趣的对象内容”。您更喜欢哪一个取决于您。

我建议的原因是,当你来使用数据时,你会希望它是可识别的,并且通过提供一个将提供相关接口的对象类型来帮助自己似乎很蠢那。

换句话说,如果您存储某些内容,则需要“标记”,以便您知道它是什么。就像你在你的车库,阁楼或存放你暂时不需要的东西的任何地方一样,但是想要保留未来。例如,你有一个说“旧鞋子”或“冬衣”,“婴儿衣服”,“书籍”等的盒子[除非你像我一样,你只是有一堆类似的盒子,不知道是什么在哪一个 - 但这是因为我的存储不是作为软件完成的]。

答案 1 :(得分:0)

最后解决方案是使用boost :: any

//ObjectOfInterest.h
public:
    ...
    bool    hasProperty(const string & prop) const;
    void    emplaceProperty(const string & prop, boost::any value);
    void    setProperty(const string & prop, boost::any value);
    template <class T> const T property(const string & prop) const
    {
    return any_cast<T>(properties.at(prop));
    }
...
private:
    ...
    boost::unordered::unordered_map<string, boost::any> properties;

//ObjectOfInterest.cpp
...
bool ObjectOfInterest::hasProperty(const string & prop) const
{
    return properties.find(prop)!=properties.end();
}

void ObjectOfInterest::emplaceProperty(const string & prop, any value)
{
    properties.emplace(prop, value);
}

void ObjectOfInterest::setProperty(const string & prop, any value)
{
    properties[prop] = value;
}