es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , , ,

Answer

  1. Avatar for 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 de MyClass, ya que no debería modificarlas.

    Aquí tienes un fragmento de código actualizado que debería funcionar para ti:

    #include <set>
    
    class MyClass {
    public:
        bool operator<(const MyClass& other) const {
            // define tu lógica de comparación aquí
            return true;
        }
    
        // Más código aquí
    
        static bool compare(const MyClass& a, const MyClass& b) {
            return a < b;
        }
    };
    
    int main() {
        std::set<myclass, bool(*)(const="" myclass&,const="" myclass&)=""> s(&MyClass::compare);
        return 0;
    }
    

    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 de MyClass y devuelve un booleano.
    • &MyClass::compare es un puntero al método compare de MyClass.
    • Pasamos este puntero como segundo argumento al constructor de 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,>

Comments are closed.