如何创建带有参数的成员函数指针数组
How do you create an array of member function pointers with arguments?
我正在尝试为模糊控制器创建一个跳转表。基本上,我有很多函数可以接收字符串并返回浮点数,我希望能够执行以下操作:
float Defuzzify(std::string varName, DefuzzificationMethod defuzz)
{
return functions[defuzz](varName);
}
其中去模糊化方法是一个枚举。目的是避免开关语句并具有 O(1) 操作。
我现在拥有的是:
float CenterOfGravity(std::string varName);
std::vector<std::function<float (std::string)>> defuzzifiers;
然后我尝试在构造函数中初始化它:
defuzzifiers.reserve(NUMBER_OF_DEFUZZIFICATION_METHODS);
defuzzifiers[DEFUZZ_COG] = std::bind(&CenterOfGravity, std::placeholders::_1);
这使得编译器抛出大约 100 个关于enable_if的错误(我不在任何地方使用,所以我假设 std 会)。有没有办法使这个编译?此外,有没有办法使其成为静态向量,因为每个模糊控制器本质上都有相同的向量?
提前致谢
保留只是确保有足够的容量,它实际上并没有将矢量的大小放大到足够大。您要做的是:
// construct a vector of the correct size
std::vector<std::function<float (std::string)>> defuzzifiers(NUMBER_OF_DEFUZZIFICATION_METHODS);
// now assign into it...
// if CentorOfGravity is a free function, just simple = works
defuzzifiers[DEFUZZ_COG] = CenterOfGravity;
// if it's a method
defuzzifiers[DEFUZZ_COG] = std::bind(&ThisType::CenterOfGravity, this, std::placeholders::_1);
现在这可能会给你留下一些实际上没有定义函数的漏洞,所以也许你想提供某种默认函数,矢量构造函数也允许
std::vector<std::function<float (std::string)>> defuzzifiers(
NUMBER_OF_DEFUZZIFICATION_METHODS,
[](std::string x) { return 0f; }
);
一个不相关的说明,您可能希望您的函数通过 const-ref 而不是按值获取字符串,因为复制字符串是昂贵的。
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 使用指向成员的指针将成员函数作为参数传递
- 如何将lambda作为模板类的成员函数参数
- 将成员函数指针作为参数传递给模板方法
- c++构造函数成员初始化:传递参数
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 模板化检查是否存在带有参数列表的类成员函数?
- 如何将类成员方法的参数列表自动填充写入可变参数?
- 为什么我需要在成员发起器列表中重复基类的模板参数?
- C++向量默认为成员参数
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 可变参数模板参数扩展 类型为 std::function 的类成员
- 绑定到可变参数成员函数
- C/C++ 包含点的宏参数(成员访问运算符)
- 将const char * const参数成员分配给新值
- 基于模板参数成员函数参数的模板专用化
- 如何访问可变参数成员
- 可变类参数成员变量的异构存储
- 非模板类中的可变参数成员