1

QVariants の QVector があります。私のクラスのインターフェースを実装するには、このベクトルに格納されたデータへの定数参照を返すゲッターを実装する必要があります。次のようになります。

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、ベクトルから position のバリアントを抽出し、その値を const 参照として に返しますT。バリアントが を格納しないT場合でも、 を返す必要があります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

最後の 3 つのクエリがデフォルト値を返すことがわかります。

注: Qt コンテナーは、要求された要素が見つからない場合、返さTれる関数 (例: ) にデフォルトを渡すことがよくあります。QMap::value()次のようなものを使用することもできます

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

編集: const-reference を一時的に返すのを修正しました。

于 2012-08-17T13:22:29.650 に答える