如何创建带有参数的成员函数指针数组?

Posted

技术标签:

【中文标题】如何创建带有参数的成员函数指针数组?【英文标题】:How do you create an array of member function pointers with arguments? 【发布时间】:2013-12-20 15:33:34 【问题描述】:

我正在尝试为模糊控制器创建一个跳转表。基本上,我有很多函数可以接收一个字符串并返回一个浮点数,我希望能够做一些类似的事情:

float Defuzzify(std::string varName, DefuzzificationMethod defuzz)

   return functions[defuzz](varName);

其中 DefuzzificationMethod 是一个枚举。目的是避免使用 switch 语句并进行 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);

这使得编译器抛出关于 enable_if 的大约 100 个错误(我不在任何地方使用,所以我假设 std 会)。有没有办法让这个编译?此外,有没有办法让它成为一个静态向量,因为每个模糊控制器基本上都有相同的向量?

提前致谢

【问题讨论】:

请解释正确的。做这项工作让我发疯,因为参考资料很少。 【参考方案1】:

保留只是确保有足够的容量,它实际上并没有使向量的大小足够大。你想做的是:

// 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 而不是按值获取字符串,因为复制字符串很昂贵。

【讨论】:

CentorOfGravity 是一个成员函数,所以这让事情变得更加困难。其他一切都很有意义(尤其是通过 const ref 传递字符串),但我仍然得到 100 多个错误。 @BrunoAyllon 也添加了如何做到这一点 效果很好,非常感谢。你太棒了。希望我有代表投票解决方案(对 SO 来说很新)。

以上是关于如何创建带有参数的成员函数指针数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用带有模板参数的成员函数指针

C++ CreateThread函数如何传递this指针作为参数

提升 C++。将带有签名指针的成员函数指针传递给函数

为啥我不能访问指向数组中成员函数的指针?

c++类的成员函数指针如何转为普通指针

<未解析的重载函数类型> 带有成员函数指针和模板