如何将 std::function 的零个或多个参数用作 std::map 中的值
How to have zero or more arguments to a std::function used as value in a std::map?
我有一个引擎类,它有一个类型为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?
};
对于这种情况还有其他建议吗?请帮忙。
您始终可以忽略参数
{
{ 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); } }
}
在这种情况下,如何声明和构造映射变量?
这在std::function
是不可能的.此模板提供了一定数量的类型擦除,因为它可以使用函数指针、有状态 lambda 或指向成员函数的指针来构造,但存在一个不变的,即您用std::function
实例近似的函数类型的签名。
您可以改为定义一个自定义聚合,其中包含参数列表的可能变体,例如
struct StateParams {
double val;
std::string data;
};
然后将函数签名更改为
RETCODE StateOn(const StateParams&);
RETCODE StateHibernate(const StateParams&);
// ...
std::map
可以有value_type
std::function<RETCODE(const StatemParams&>
.
相关文章:
- 带有指定长度字符* 参数的 std::regex_search 在 VS2017 中不起作用?
- 为什么 std::function 可以作为 std::not2 的参数?
- 传递给std::function template的template参数究竟代表什么
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 将函数参数"const char*"转换为"std::string_view"是
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 为什么 std::绑定错误参数可以成功?
- 使用模板化的键类型定义 std::map,该键类型基于作为参数接收的函数
- std::vector 没有重载函数的实例与参数列表匹配
- std::span<const T> 作为函数模板中的参数
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 如果模板没有可变参数,则 Lambda 被推导出为 std::function
- 将参数打包的参数传递到 std::queue 中,以便稍后使用不同的函数调用
- 在构造函数中使用可变参数初始化 std::tuple
- 为什么我不能将引用作为 std::async 的函数参数传递
- 转发变量参数列表以模拟 std::thread
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- "std::shared_ptr":不是参数"_Ty"的有效模板类型参数
- 可变参数模板参数扩展 类型为 std::function 的类成员