gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:10:17 25 4
gpt4 key购买 nike

我正在尝试为模糊 Controller 创建一个跳转表。基本上,我有很多接受字符串并返回 float 的函数,我希望能够按照以下几行做一些事情:

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 会使用)。有没有办法进行编译?此外,有没有办法使它成为静态 vector ,因为每个模糊 Controller 基本上都具有相同的 vector ?

提前致谢

最佳答案

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

// 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);

现在这可能会给你留下一些实际上没有定义函数的漏洞,所以也许你想提供一个默认的排序函数, vector 构造函数也允许这样做

std::vector<std::function<float (std::string)>> defuzzifiers(
NUMBER_OF_DEFUZZIFICATION_METHODS,
[](std::string x) { return 0f; }
);

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

关于c++ - 如何创建带参数的成员函数指针数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20706991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com