首页 > 解决方案 > 调用 QVariant::toMap() 时如何避免创建副本?

问题描述

我将 QVariantMap 作为 QVariant 存储在另一个 QVariant 中。我需要在插槽函数中的这个嵌套的 QVariantMap 中添加文件。这是我到目前为止所拥有的:-

QVariantMap map = data["nestedMap"].toMap(); //first copy 
map[newfield] = assingCoolStuff(); //add new filed to nestedMap
data["nestedMap"] = map; // second copy ?

如果我是正确的,那么它会两次创建 nestedMap 副本并且运行速度会很慢。有没有办法优化这个?

标签: c++qtqvariant

解决方案


template<class T>
T* cast(QVariant& variant)
{
    if (variant.userType() == qMetaTypeId<T>())
        return reinterpret_cast<T*>(variant.data());
    return 0;
}

QVariantMap &map = *cast<QVariantMap>(data["nestedMap"]);
map[newfield] = assingCoolStuff();

如果data["nestedMap"]可能不包含QVariantMap,则需要更改代码。


推荐阅读