2012-08-17 22 views
1

我有QVariants QVector。爲了實現我的類的接口,我應該實現getter,它將返回存儲在此向量中的數據的常量引用。它看起來像:鑑於QVariant,請參考某些類型的變量

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 ...)。有沒有更好的方式來做我正在做的事情?

+0

只有指針存儲在'QVariant's? – cmannett85 2012-08-17 11:09:58

+0

我不存儲QVariants中的指針。 – nikitoz 2012-08-17 11:26:14

+0

那麼你爲什麼試圖投射到一個指針? 'QVariant :: constData()'不存在。 – cmannett85 2012-08-17 11:31:08

回答

1

我不知道,如果我正確理解你的話。但是,以下代碼將從您的向量中提取位置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引用。

+0

問題是,你的代碼返回了對'value'函數堆棧上創建的變量的引用。 '警告C4172:返回本地變量或臨時地址' – nikitoz 2012-08-17 13:31:08

+0

@nikitoz:我解決了這個問題。 – Mehrwolf 2012-08-17 15:48:02