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.

Usando std::bind con métodos sobrecargados en un espacio de nombres en C++

#include <iostream>
#include <map>
#include <functional>

namespace xAOD{
    namespace EgammaParameters{
        enum TipoFormaDucha{
            var1 = 0,
            var2 = 1,
            var3 = 3
        };
    };

    class Photon{
    public:
        double test(const EgammaParameters::TipoFormaDucha informacion) const {return 1;}
    private:
    };
};

struct funcLookup{
    funcLookup(xAOD::Photon* photon){
        lookup_callback["test"] = std::bind(&xAOD::Photon::test, photon, xAOD::EgammaParameters::TipoFormaDucha::var1);
    }

    double call(std::string name){
        if (lookup_callback.count(name) > 0){
            return lookup_callback[name]();
        }
        else{
            std::cerr << "Llamada de función inválida" << std::endl;
            return -1;
        } 
    }

    std::map<std::string,></std::string,><double(void)>> lookup_callback;
};

int main(){
    xAOD::Photon* photon;
    funcLookup funcMap(photon);
    std::cout << funcMap.call("test") << std::endl;

    return 0;
}

Estoy tratando de enlazar un método (test) que está sobrecargado en el espacio de nombres EgammaParameters dentro de la clase Photon. Según entiendo, necesito indicarle específicamente a C++ qué método sobrecargado debe usar, por lo que intenté usar un casting estático como:

std::bind(static_cast<double(&)(const xaod::egammaparameters::tipoformaducha)="">(&xAOD::Photon::test), photon, xAOD::EgammaParameters::TipoFormaDucha::var1);

Sin embargo, esto me da el error `error: invalid static_cast from type ‘’ to type ‘double (&)(xAOD::EgammaParameters::TipoFormaDucha)’. ¿Qué me falta?</double(&)(const></double(void)>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que la conversión estática no funciona correctamente en este caso. Una posibilidad sería crear un typedef para la sobrecarga específica del método que queremos usar y luego utilizarlo en la declaración bind. Por ejemplo:

    c++
    typedef double (xAOD::Photon::*test_type)(const xAOD::EgammaParameters::ShowerShapeType) const;
    lookup_callback["test"] = std::bind(static_cast<test_type>(&xAOD::Photon::test), photon, xAOD::EgammaParameters::ShowerShapeType::var1);

    De esta manera, le estamos indicando a C++ que queremos utilizar un tipo específico (test_type) que corresponde a la firma del método que nos interesa. La conversión estática debería funcionar correctamente en este caso y podemos enlazar el método utilizando std::bind.

Comments are closed.