2014-09-25 2 views
5

QDomModel 간단한 예제를 편집하여 일부 응용 프로그램에 고기를 추가하고 가끔 추가 한 일부 상태 플래그를 지워야합니다. QAbstractItem 모델의 항목을 반복 할 때는 표준 반복자가 제공되지 않으므로 일종의 성가신 일이기 때문에 for_each 스타일 함수를 직접 작성하여 각 항목을 반복하고 함수 'f'를 수행 할 수 있습니다.QAbstractItemModel 펑터가있는 반복자를 foreach : 더 좋은 방법이 있나요?

template<typename Functor> 
void foreach_item(Functor f, QModelIndex &parent = QModelIndex()) 
{ 
    if (!parent.isValid()) 
     parent = index(0,0,QModelIndex()); 

    int numRows = rowCount(parent); 

    for (int i=0; i<numRows; i++) 
    { 
     foreach_item(f,index(i,0,parent));  
    } 

    f(parent); 
} 

이 작동하고 나는 그것을 큰 람다 또는 펑의 모든 종류를 제공하고과 같이 호출 할 수 있습니다 :

void QDomModel::clearChanges() 
{ 
    foreach_item([&](QModelIndex parent) 
    { 
     QDomItem* item = static_cast<QDomItem*>(parent.internalPointer()); 
     item->valueChanged = false; 
    }); 
    changeCount = 0; 
} 

을이 매우 강력하지만 나는 데 문제가 있다는 것입니다 당신이하지 않는 코드를 파헤 치면 functor/lambda의 서명이 무엇인지 알 수 없습니다. 당신이 잘못한 것을 주면 컴파일 에러가 발생하지만, 이러한 타입의 함수를 생성하기 위해 나쁜 인터페이스 (또는 일반적으로 나쁜 코딩 방법)가 될 수 있다고 걱정됩니다.

인수를 취할 때 명확성을 위해 함수 포인터를 요청하는 것이 좋습니다. 한 가지 방법과 다른 것에 대한 함의 나 제한이 있습니까?

+0

표준 라이브러리는 기능의 예상되는 서명을 문서화합니다. 타입 지우기를 사용하기 때문에'std :: function'을 생성하면 일반 함수 나 lambda보다 성능이 떨어집니다. –

답변

2

std::function을 입력하면 서명에 유형을 표시 할 수 있습니다. 다음과 같이 시도하십시오 :

void foreach_item(const std::function<void(const QModelIndex&)> &f, QModelIndex parent = QModelIndex()) 
{ 
    /*...*/ 
}