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

C++ 如何创建带有参数的成员函数指针数组?,c++,c++11,functional-programming,bind,member-function-pointers,C++,C++11,Functional Programming,Bind,Member Function Pointers,我试图为模糊控制器创建一个跳转表。基本上,我有很多函数,它们接受字符串并返回浮点,我希望能够按照以下方式做一些事情: float Defuzzify(std::string varName, DefuzzificationMethod defuzz) { return functions[defuzz](varName); } 其中,DefuzzificationMethod是一个枚举。目的是避免使用switch语句,并进行O(1)操作 我现在得到的是: float CenterOfGr

我试图为模糊控制器创建一个跳转表。基本上,我有很多函数,它们接受字符串并返回浮点,我希望能够按照以下方式做一些事情:

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;
这使得编译器抛出大约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::向量解模糊器(解模糊方法的数量);
//现在分配给它。。。
//如果CentorOfGravity是一个自由函数,那么simple=works就可以了
解模糊器【解模糊中心】=重心;
//如果这是一种方法
解模糊器[DEFUZZ_COG]=std::bind(&ThisType::重心,this,std::占位符::_1);
这可能会留下一些漏洞,实际上没有定义函数,所以可能需要提供一个默认的排序函数,这也是向量构造函数允许的

std::vector<std::function<float (std::string)>> defuzzifiers(
    NUMBER_OF_DEFUZZIFICATION_METHODS,
    [](std::string x) { return 0f; }
);
std::向量解模糊器(
解模糊方法的数量,
[](std::string x){return 0f;}
);

另一个不相关的注意事项是,您可能希望函数按const ref而不是按值获取字符串,因为复制字符串很昂贵

请解释正确的一个。做这项工作让我抓狂,因为引用很少。CentorOfGravity是一个成员函数,所以这让事情变得有点困难。“其他一切都很有意义(特别是通过const ref传递字符串),但我仍然得到100多个错误。”BrunoAyllon补充了如何做到这一点,它工作得非常好,非常感谢。你太棒了。但愿我有代表投票支持这个解决方案(这对我来说是个新鲜事)。
std::vector<std::function<float (std::string)>> defuzzifiers(
    NUMBER_OF_DEFUZZIFICATION_METHODS,
    [](std::string x) { return 0f; }
);