如何将 std::function 的零个或多个参数用作 std::map 中的值?
How to have zero or more arguments to a std::function used as value in a std::map?
我有一个引擎 class,它有一个 std::map 类型的成员,它将枚举映射到成员函数。
如果函数的参数数量相同,我可以将枚举映射到所有函数。
enum STATE { OFF, ON, HIBERNATE, RESTART };
enum RETCODE { SUCCESS, FAIL, UNKNOWN, OUTOFBOUND };
class Engine
{
Engine();
RETCODE StateOn(double val);
RETCODE StateOff(double val);
RETCODE StateHibernate(double val);
RETCODE StateRestart(double val);
private:
const std::map<STATE, std::function<RETCODE(double)>> Map_State_FnPtr;
};
Engine::Engine() : Map_State_FnPtr {
{ STATE::ON, [=](double val) {return StateOn(val); } },
{ STATE::OFF, [=](double val) {return StateOff(val); } },
{ STATE::HIBERNATE, [=](double val) {return StateHibernate(val); } },
{ STATE::RESTART, [=](double val) {return StateRestart(val); } }
}
{
// c'tor body
}
但我有一个场景,其中一些函数可以有零个或多个参数。
在这种情况下如何声明和构造地图变量?
class Engine
{
Engine();
RETCODE StateOn(); // No arguments
RETCODE StateOff(double val); // 1 argument
RETCODE StateHibernate(double val, const std::string & data); // Multiple arguments
RETCODE StateRestart(double val);
private:
const std::unordered_map<STATE, std::function<RETCODE()>> Map_State_FnPtr; // What should be the declaration?
};
对于这种情况还有其他建议吗?
请帮忙。
How do I declare & construct the map variable in such scenario?
std::function
这是不可能的。这个模板提供了一定数量的类型擦除,因为它可以用函数指针、有状态的 lambda 或指向成员函数的指针构造,但有一个不变量,即你用 [=12= 近似的函数类型的签名]实例。
您可以改为定义包含参数列表可能变化的自定义聚合,例如
struct StateParams {
double val;
std::string data;
};
然后将您的函数签名更改为
RETCODE StateOn(const StateParams&);
RETCODE StateHibernate(const StateParams&);
// ...
和 std::map
可以有一个 value_type
std::function<RETCODE(const StatemParams&>
.
您始终可以忽略参数
{
{ STATE::ON, [=](double, const std::string &) {return StateOn(); } },
{ STATE::OFF, [=](double val, const std::string &) {return StateOff(val); } },
{ STATE::HIBERNATE, [=](double val, const std::string & data) {return StateHibernate(val, data); } },
{ STATE::RESTART, [=](double val, const std::string &) {return StateRestart(val); } }
}
我有一个引擎 class,它有一个 std::map 类型的成员,它将枚举映射到成员函数。 如果函数的参数数量相同,我可以将枚举映射到所有函数。
enum STATE { OFF, ON, HIBERNATE, RESTART };
enum RETCODE { SUCCESS, FAIL, UNKNOWN, OUTOFBOUND };
class Engine
{
Engine();
RETCODE StateOn(double val);
RETCODE StateOff(double val);
RETCODE StateHibernate(double val);
RETCODE StateRestart(double val);
private:
const std::map<STATE, std::function<RETCODE(double)>> Map_State_FnPtr;
};
Engine::Engine() : Map_State_FnPtr {
{ STATE::ON, [=](double val) {return StateOn(val); } },
{ STATE::OFF, [=](double val) {return StateOff(val); } },
{ STATE::HIBERNATE, [=](double val) {return StateHibernate(val); } },
{ STATE::RESTART, [=](double val) {return StateRestart(val); } }
}
{
// c'tor body
}
但我有一个场景,其中一些函数可以有零个或多个参数。 在这种情况下如何声明和构造地图变量?
class Engine
{
Engine();
RETCODE StateOn(); // No arguments
RETCODE StateOff(double val); // 1 argument
RETCODE StateHibernate(double val, const std::string & data); // Multiple arguments
RETCODE StateRestart(double val);
private:
const std::unordered_map<STATE, std::function<RETCODE()>> Map_State_FnPtr; // What should be the declaration?
};
对于这种情况还有其他建议吗? 请帮忙。
How do I declare & construct the map variable in such scenario?
std::function
这是不可能的。这个模板提供了一定数量的类型擦除,因为它可以用函数指针、有状态的 lambda 或指向成员函数的指针构造,但有一个不变量,即你用 [=12= 近似的函数类型的签名]实例。
您可以改为定义包含参数列表可能变化的自定义聚合,例如
struct StateParams {
double val;
std::string data;
};
然后将您的函数签名更改为
RETCODE StateOn(const StateParams&);
RETCODE StateHibernate(const StateParams&);
// ...
和 std::map
可以有一个 value_type
std::function<RETCODE(const StatemParams&>
.
您始终可以忽略参数
{
{ STATE::ON, [=](double, const std::string &) {return StateOn(); } },
{ STATE::OFF, [=](double val, const std::string &) {return StateOff(val); } },
{ STATE::HIBERNATE, [=](double val, const std::string & data) {return StateHibernate(val, data); } },
{ STATE::RESTART, [=](double val, const std::string &) {return StateRestart(val); } }
}