2014-09-25 7 views
5

Sto modificando l'esempio semplice di QDomModel per aggiungere un po 'di carne per la mia applicazione e ho bisogno di cancellare alcune bandiere di stato che ho aggiunto occasionalmente. L'iterazione degli elementi di un modello QAbstractItem è un po 'fastidiosa dal momento che non viene fornito alcun iteratore standard, quindi ho scritto la mia funzione for_each-style per scorrere ogni elemento ed eseguire la funzione' f 'su di esso.QAbstractItemModel foreach iterator con functors: c'è un modo migliore per farlo?

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

Questo funziona e posso dare tutti i tipi di grandi lambda o funtori e chiamarlo in questo modo:

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

Questo è molto potente, ma il problema che sto avendo è che se non si scavato nel codice, non avresti idea di cosa dovrebbe essere la firma del functor/lambda. Si ottiene un errore di compilazione se si dà qualcosa di sbagliato, ma sono preoccupato che questa possa essere una cattiva interfaccia (o una cattiva pratica di codifica in generale) per la creazione di questi tipi di funzioni.

È meglio, durante l'assunzione di argomenti, chiedere i puntatori di funzione per chiarezza? Ci sono implicazioni o limitazioni nel fare un modo contro l'altro di cui dovrei essere a conoscenza?

+0

La libreria standard documenta solo qual è la firma prevista della funzione. Creare una 'std :: function', dato che usa cancellazioni di tipi, diminuisce le prestazioni rispetto a funzioni semplici o lambda. –

risposta

2

std::function consente di esporre il tipo nella firma. Prova qualcosa del tipo:

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