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의 서명이 무엇인지 알 수 없습니다. 당신이 잘못한 것을 주면 컴파일 에러가 발생하지만, 이러한 타입의 함수를 생성하기 위해 나쁜 인터페이스 (또는 일반적으로 나쁜 코딩 방법)가 될 수 있다고 걱정됩니다.
인수를 취할 때 명확성을 위해 함수 포인터를 요청하는 것이 좋습니다. 한 가지 방법과 다른 것에 대한 함의 나 제한이 있습니까?
표준 라이브러리는 기능의 예상되는 서명을 문서화합니다. 타입 지우기를 사용하기 때문에'std :: function'을 생성하면 일반 함수 나 lambda보다 성능이 떨어집니다. –