1

我有 QVariants 的 QVector。为了实现我的类的接口,我应该实现 getter,它将返回对数据的常量引用,存储在这个向量中。看起来像:

const QString& getSomeProperty()
{
    return value<QString>(0);
}

template <typename MyType>
const T& value (int index)
{
    const MyType* ptr = static_cast<const MyType*>(m_d.at(index).constData());
    if (ptr)
        return *ptr;
    else
        return static_cast<T>(QVariant());
}

QVector<QVariant> m_d;

我不能使用非 QVariants 的向量,因为需要存储不同的类型。我不能使用 Qt3 方法(asString、asBool ...)。有没有更好的方法来做我正在做的事情?

4

1 回答 1

1

我不知道,如果我理解正确的话。但是,以下代码index将从您的向量中提取位置处的变量,并将其值作为 const 引用返回T。如果变体不存储 a T,您仍然必须返回 a T。因此,您需要一些默认值,在这种情况下您可以返回。

template <typename T>
const T& value(int index)
{
    // Some value to return, if the variant does not store a T.
    static T defaultValue;

    const QVariant& variant = m_d.at(index);

    // If the variant stores a T, return it.
    if (variant.userType() == qMetaTypeId<T>())
        return *reinterpret_cast<const T*>(variant.constData());

    // Return the default value. Or add an assertion here. Or throw
    // an exception etc.
    return defaultValue;
}

这个简单的测试用例

m_d.push_back(10);
m_d.push_back(QString("Hello"));
m_d.push_back(3.14);

// This returns what is stored in the vector.
qDebug() << value<int>(0);
qDebug() << value<QString>(1);
qDebug() << value<double>(2);

// This returns the default value.
qDebug() << value<int>(1);
qDebug() << value<QString>(2);
qDebug() << value<double>(0);

产生以下输出

10
"Hello"
3.14
0
""
0

您可以在其中看到最后三个查询返回默认值。

注意:如果 Qt 容器找不到请求的元素,它们通常会将默认值传递给它们返回T的函数(例如)。QMap::value()您也可以尝试使用类似的东西

template <typename T>
T value(int index, const T& defaultValue = T())
{
    ...
}

编辑:修复了从临时返回一个常量引用。

于 2012-08-17T13:22:29.650 回答