我正在尝试为模糊控制器创建一个跳转表。基本上,我有很多函数接受一个字符串并返回一个浮点数,我希望能够做到这一点:
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);
这使得编译器抛出大约100个关于enable_if的错误(我不会在任何地方使用它,所以我假设std会这样做)。有没有办法让这个编译?此外,有没有办法使它成为一个静态向量,因为每个模糊控制器基本上都有相同的向量?
提前致谢
答案 0 :(得分:2)
保留只是确保有足够的容量,它实际上并没有足够大的矢量大小。你想要做的是:
// 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而不是值来获取字符串,因为复制字符串很昂贵。