Esiste una classe che contiene alcuni dati e li ordina in un determinato momento. Io uso qsort()
e mi piacerebbe mantenere la funzione di confronto all'interno della classe come metodo. La domanda è come passare un metodo a qsort()
in modo che il compilatore (g ++) non lanci alcun avvertimento?Come passare un metodo a qsort?
Tentativo 1:
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
In questo modo genera un errore:
error: cannot convert ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’ for argument ‘4’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
Tentativo 2:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
questo modo genera un avvertimento:
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’
Come fare nel modo giusto allora?
Non si dovrebbe usare 'qsort' in C++. Mai. Mai. 'std :: sort' è * più veloce *, più flessibile e typesafe,' qsort' non è niente di tutto ciò. Basta dimenticare che 'qsort' è mai esistito, almeno a meno che non si arrivi all'ambiente in cui è necessario utilizzare semplicemente C. –
Si dovrebbe usare' std :: sort' invece della funzione 'C'' qsort'. Il fatto che questa funzione tenga gli argomenti 'void *' sconfigge la maggior parte dell'ottimizzazione che un compilatore potrebbe fare (conf H. Sutter). – log0
Infatti, se 'Data' ha un costruttore di copie non banale o un distruttore non banale, l'uso di' qsort' è Comportamento indefinito. Può fare qualsiasi cosa, vomitando tutta la memoria essendo una delle possibilità più piacevoli. –