我不知道,如果我正確理解你的話。但是,以下代碼將從您的向量中提取位置index
上的變體,並將其值作爲常量引用返回給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
在這裏你可以看到,在過去三個查詢返回的默認值。
注:通常的Qt容器傳遞一個默認T
的功能(例如QMap::value()
),他們回來,如果他們找不到請求的元素。您也可以嘗試使用類似
template <typename T>
T value(int index, const T& defaultValue = T())
{
...
}
編輯:固定返回臨時從一個const引用。
只有指針存儲在'QVariant's? – cmannett85 2012-08-17 11:09:58
我不存儲QVariants中的指針。 – nikitoz 2012-08-17 11:26:14
那麼你爲什麼試圖投射到一個指針? 'QVariant :: constData()'不存在。 – cmannett85 2012-08-17 11:31:08