2014-09-25 14 views
5

Ich bearbeite das einfache QDomModel-Beispiel, um etwas Fleisch für meine Anwendung hinzuzufügen, und muss einige Statusflags löschen, die ich gelegentlich hinzugefügt habe. Das Iterieren durch die Elemente eines QAbstractItem-Modells ist irgendwie ärgerlich, da kein Standard-Iterator bereitgestellt wird. Daher habe ich meine eigene for_each-style-Funktion geschrieben, um jedes Element zu durchlaufen und die Funktion 'f' darauf auszuführen.QAbstractItemModel foreach Iterator mit Funktoren: Gibt es einen besseren Weg, dies zu tun?

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); 
} 

Dies funktioniert und ich kann es alle Arten von großen lambdas oder functors geben und es wie so nennen:

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

Dies ist sehr mächtig, aber das Problem, das ich habe, ist, dass, wenn Sie in den Code gegraben, hättest du keine Ahnung, was die Signatur des Funktors/Lambdas sein soll. Sie erhalten einen Kompilierfehler, wenn Sie etwas falsches angeben, aber ich befürchte, dass dies eine schlechte Schnittstelle (oder eine schlechte Codepraxis im Allgemeinen) für die Erstellung dieser Arten von Funktionen sein könnte.

Ist es bei Argumenten besser, nach Funktionszeigern zu suchen, um Klarheit zu schaffen? Gibt es irgendwelche Implikationen oder Einschränkungen in Bezug auf die eine oder andere Art, auf die ich achten sollte?

+0

Die Standardbibliothek dokumentiert nur, was die erwartete Signatur der Funktion ist. Das Erstellen einer 'std :: function' verringert die Leistung gegenüber einfachen Funktionen oder Lambdas. –

Antwort

2

std::function können Sie den Typ in der Signatur verfügbar machen. Versuchen Sie etwas wie:

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