私があなたを正しく理解したかどうかはわかりません。ただし、次のコードは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 を一時的に返すのを修正しました。