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)>
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.