我不知道,如果我理解正确的话。但是,以下代码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())
{
...
}
编辑:修复了从临时返回一个常量引用。