Cómo utilizar un método estático como una devolución de llamada en C++
Tengo una función de comparación/ordenación que está relacionada con una clase. Puedo utilizarla si la defino como un objeto de cierre separado. Me gustaría convertirla en un método estático de la clase en la que opera para que sea más ordenado. Adiviné cómo hacer esto, pero obtengo un error que no puedo interpretar.
En general, me gustaría saber cómo tratar los métodos estáticos como objetos invocables.
Código de ejemplo relacionado mínimo (que no funciona):
// Incluir la biblioteca <set>
#include <set>
class MyClass {
// Más código aquí
public:
static bool compare(MyClass a, MyClass b) {
return a < b;
}
};
int main() {
std::set<myclass, decltype(&myclass::compare)=""> s(&MyClass::compare);
return 0;
}
Actualización, no estoy seguro si mi ejemplo ha generado confusión, así que lo he actualizado.</myclass,>
davy.ai
Para tratar un método estático como un objeto llamable, puedes utilizar un puntero al método como segundo argumento en el parámetro de plantilla del contenedor. En tu caso, el error que estás obteniendo puede deberse al hecho de que el método
compare
debería tomar referencias constantes a instancias deMyClass
, ya que no debería modificarlas.Aquí tienes un fragmento de código actualizado que debería funcionar para ti:
En este código actualizado:
bool(*)(const MyClass&,const MyClass&)
es el tipo de un puntero a una función que toma dos referencias constantes a instancias deMyClass
y devuelve un booleano.&MyClass::compare
es un puntero al métodocompare
deMyClass
.set
.Ten en cuenta que también podrías utilizar
std::function
en lugar de un puntero a función, lo cual te permitiría vincular argumentos adicionales a la función. Sin embargo, esto incurre en una sobrecarga adicional y solo debe utilizarse si realmente necesitas la flexibilidad extra.</myclass,>