#include <unordered_map>
#include <string>
#include <utility>
struct BeliefCondFunc
{
using cb_type = bool(*)();
static std::unordered_map<std::string, cb_type> const FuncMap;
static bool Greater(int A, int B)
{
return A > B;
}
static bool Between(float A, float B, float C)
{
return A > B && A < C;
}
template<typename ...Args>
static bool call(std::string const& key, Args&&... args){
using prototype = bool(*)(Args...);
return reinterpret_cast<prototype>(FuncMap.at(key))(std::forward<Args>(args)...);
};
};
std::unordered_map<std::string, BeliefCondFunc::cb_type> const BeliefCondFunc::FuncMap {
{"Greater", reinterpret_cast<cb_type>(&BeliefCondFunc::Greater) },
{"Between", reinterpret_cast<cb_type>(&BeliefCondFunc::Between) }
};
int main() {
BeliefCondFunc::call("Greater", 1, 2);
return 0;
}
I2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDx1dGlsaXR5PgoKc3RydWN0IEJlbGllZkNvbmRGdW5jCnsKICAgIHVzaW5nIGNiX3R5cGUgPSBib29sKCopKCk7CiAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBjYl90eXBlPiBjb25zdCBGdW5jTWFwOwogICAgCiAgICBzdGF0aWMgYm9vbCBHcmVhdGVyKGludCBBLCBpbnQgQikKICAgIHsKICAgICAgICByZXR1cm4gQSA+IEI7CiAgICB9CgogICAgc3RhdGljIGJvb2wgQmV0d2VlbihmbG9hdCBBLCBmbG9hdCBCLCBmbG9hdCBDKQogICAgewogICAgICAgIHJldHVybiBBID4gQiAmJiBBIDwgQzsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KICAgIHN0YXRpYyBib29sIGNhbGwoc3RkOjpzdHJpbmcgY29uc3QmIGtleSwgQXJncyYmLi4uIGFyZ3MpewogICAgICB1c2luZyBwcm90b3R5cGUgPSBib29sKCopKEFyZ3MuLi4pOwogICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxwcm90b3R5cGU+KEZ1bmNNYXAuYXQoa2V5KSkoc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKICAgIH07Cn07CgpzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIEJlbGllZkNvbmRGdW5jOjpjYl90eXBlPiBjb25zdCBCZWxpZWZDb25kRnVuYzo6RnVuY01hcCB7CiAgeyJHcmVhdGVyIiwgcmVpbnRlcnByZXRfY2FzdDxjYl90eXBlPigmQmVsaWVmQ29uZEZ1bmM6OkdyZWF0ZXIpIH0sCiAgeyJCZXR3ZWVuIiwgcmVpbnRlcnByZXRfY2FzdDxjYl90eXBlPigmQmVsaWVmQ29uZEZ1bmM6OkJldHdlZW4pIH0KfTsKCmludCBtYWluKCkgewoJQmVsaWVmQ29uZEZ1bmM6OmNhbGwoIkdyZWF0ZXIiLCAxLCAyKTsKCXJldHVybiAwOwp9