2012-08-17 2 views
1

QVector의 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; 

다른 유형을 저장할 필요가 있기 때문에 비 QVariant의 벡터를 사용할 수 없습니다. Qt3 메서드 (asString, asBool ...)를 사용할 수 없습니다. 내가하고있는 일을하는 더 좋은 방법이 있습니까?

+0

오직 포인터가'QVariant'에 ​​저장되어 있습니까? – cmannett85

+0

QVariant에 포인터를 저장하지 않습니다. – nikitoz

+0

그런데 왜 포인터에 캐스팅하려고합니까? 그리고'QVariant :: constData()'도 존재하지 않습니다. – cmannett85

답변

1

나는 당신을 올바르게 이해하는 지 모르겠다. 그러나 다음 코드는 벡터에서 index 위치의 변형을 추출하고 그 값을 T에 대한 const 참조로 반환합니다. 변형에 T이 저장되지 않은 경우에도 T을 반환해야합니다. 따라서이 경우 반환 할 수있는 몇 가지 기본값이 필요합니다. 지난 3 개 쿼리는 기본 값을 반환하는 것을 볼 수있는

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는 용기 종종 함수가 반환 (예를 들어 QMap::value())에 기본 T를 전달합니다. 또한

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

편집 같은 것을 사용하려고 수 있습니다 임시에서 const를 참조를 반환 수정되었습니다.

+0

문제는 코드가 'value'함수의 스택에서 생성 된 변수에 대한 참조를 반환한다는 것입니다. '경고 C4172 : 지역 변수 또는 임시 주소 반환하기 ' – nikitoz

+0

@nikitoz : 문제가 해결되었습니다. – Mehrwolf

관련 문제