Hay una clase que contiene algunos datos y los ordena en algún momento. Yo uso qsort()
y me gustaría mantener la función de comparación dentro de la clase como método. La pregunta es cómo pasar un método al qsort()
para que el compilador (g ++) no arroje ninguna advertencia.¿Cómo pasar un método a qsort?
Intento 1:
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
esta manera genera un error:
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*))’
Intento 2:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
esta manera genera una advertencia:
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’
¿Cómo hacerlo de la manera correcta, entonces?
No debe utilizar 'qsort' en C++. Nunca. Nunca. 'std :: sort' es * faster *, más flexible y seguro,' qsort' no es nada de eso. Olvidémonos de que 'qsort' existió alguna vez, al menos a menos que alguna vez llegue al entorno en el que necesite utilizar C. simple –
Debería usar' std :: sort' en lugar de la función 'C'' qsort'. El hecho de que esta función tome argumentos 'void *' derrota la mayor parte de la optimización que un compilador podría hacer (conf. H. Sutter). – log0
De hecho, si 'Data' tiene un constructor de copia no trivial o un destructor no trivial, el uso de' qsort' es Undefined Behavior. Puede hacer cualquier cosa, vomitar por toda la memoria es una de las posibilidades más agradables. –