在 C++ 的命名空间中使用 std::bind 和重载方法
Using std::bind with overloaded methods in namespace in C++
#include <iostream>
#include <map>
#include <functional>
namespace xAOD{
namespace EgammaParameters{
enum ShowerShapeType{
var1 = 0,
var2 = 1,
var3 = 3
};
};
class Photon{
public:
// I don't want to use this overload
//double test(float& value, const EgammaParameters::ShowerShapeType information) const {return 1;}
// I want to use this overload
double test(const EgammaParameters::ShowerShapeType information) const {return 1;}
private:
};
};
struct funcLookup
{
funcLookup(xAOD::Photon * photon)
{
//this works without the first overload
lookup_callback["test"] = std::bind(&xAOD::Photon::test, photon, xAOD::EgammaParameters::ShowerShapeType::var1);
// static casting doesn't work:
//lookup_callback["test"] = std::bind(static_cast<double(&)(const xAOD::EgammaParameters::ShowerShapeType)>(&xAOD::Photon::test), photon,xAOD::EgammaParameters::ShowerShapeType::var1);
}
double call(std::string name)
{
if (lookup_callback.count(name) > 0){
return lookup_callback[name]();
}
else{
std::cerr << "Invalid Function Call "<< std::endl;
return -1;
}
}
std::map<std::string, std::function<double(void)>> lookup_callback;
};
int main()
{
xAOD::Photon * photon;
funcLookup funcMap(photon);
std::cout<<funcMap.call("test")<<std::endl;
return 0;
}
我正在尝试绑定一个方法(测试),该方法在 class Photon 的命名空间 EgammaParameters 中过载。据我所知,我需要明确告诉 C++ 它应该使用哪个重载方法,所以我尝试使用静态转换,如:
std::bind(static_cast<double(&)(const xAOD::EgammaParameters::ShowerShapeType)>(&xAOD::Photon::test), photon,xAOD::EgammaParameters::ShowerShapeType::var1);
然而,这给了我错误 error: invalid static_cast from type ‘’ to type ‘double (&)(xAOD::EgammaParameters::ShowerShapeType)
。我错过了什么?
使用 lambda 更容易:
lookup_callback["test"] = [=] {
return photon->test(xAOD::EgammaParameters::ShowerShapeType::var1);
};
如果你真的想使用绑定:
lookup_callback["test"] = std::bind(
static_cast<double (xAOD::Photon::*)
(xAOD::EgammaParameters::ShowerShapeType) const>(
&xAOD::Photon::test),
photon,
xAOD::EgammaParameters::ShowerShapeType::var1);
我建议至少使用一个辅助别名:
using TestType
= double (xAOD::Photon::*) (xAOD::EgammaParameters::ShowerShapeType) const;
lookup_callback["test"] = std::bind(
static_cast<TestType>(&xAOD::Photon::test),
photon,
xAOD::EgammaParameters::ShowerShapeType::var1);
从 C++20 开始,我建议将 std::bind
替换为 std::bind_front
。
#include <iostream>
#include <map>
#include <functional>
namespace xAOD{
namespace EgammaParameters{
enum ShowerShapeType{
var1 = 0,
var2 = 1,
var3 = 3
};
};
class Photon{
public:
// I don't want to use this overload
//double test(float& value, const EgammaParameters::ShowerShapeType information) const {return 1;}
// I want to use this overload
double test(const EgammaParameters::ShowerShapeType information) const {return 1;}
private:
};
};
struct funcLookup
{
funcLookup(xAOD::Photon * photon)
{
//this works without the first overload
lookup_callback["test"] = std::bind(&xAOD::Photon::test, photon, xAOD::EgammaParameters::ShowerShapeType::var1);
// static casting doesn't work:
//lookup_callback["test"] = std::bind(static_cast<double(&)(const xAOD::EgammaParameters::ShowerShapeType)>(&xAOD::Photon::test), photon,xAOD::EgammaParameters::ShowerShapeType::var1);
}
double call(std::string name)
{
if (lookup_callback.count(name) > 0){
return lookup_callback[name]();
}
else{
std::cerr << "Invalid Function Call "<< std::endl;
return -1;
}
}
std::map<std::string, std::function<double(void)>> lookup_callback;
};
int main()
{
xAOD::Photon * photon;
funcLookup funcMap(photon);
std::cout<<funcMap.call("test")<<std::endl;
return 0;
}
我正在尝试绑定一个方法(测试),该方法在 class Photon 的命名空间 EgammaParameters 中过载。据我所知,我需要明确告诉 C++ 它应该使用哪个重载方法,所以我尝试使用静态转换,如:
std::bind(static_cast<double(&)(const xAOD::EgammaParameters::ShowerShapeType)>(&xAOD::Photon::test), photon,xAOD::EgammaParameters::ShowerShapeType::var1);
然而,这给了我错误 error: invalid static_cast from type ‘’ to type ‘double (&)(xAOD::EgammaParameters::ShowerShapeType)
。我错过了什么?
使用 lambda 更容易:
lookup_callback["test"] = [=] {
return photon->test(xAOD::EgammaParameters::ShowerShapeType::var1);
};
如果你真的想使用绑定:
lookup_callback["test"] = std::bind(
static_cast<double (xAOD::Photon::*)
(xAOD::EgammaParameters::ShowerShapeType) const>(
&xAOD::Photon::test),
photon,
xAOD::EgammaParameters::ShowerShapeType::var1);
我建议至少使用一个辅助别名:
using TestType
= double (xAOD::Photon::*) (xAOD::EgammaParameters::ShowerShapeType) const;
lookup_callback["test"] = std::bind(
static_cast<TestType>(&xAOD::Photon::test),
photon,
xAOD::EgammaParameters::ShowerShapeType::var1);
从 C++20 开始,我建议将 std::bind
替换为 std::bind_front
。