gpt4 book ai didi

c++ - 在构造函数中将类成员函数分配给映射

转载 作者:行者123 更新时间:2023-12-03 06:57:37 25 4
gpt4 key购买 nike

我有一个类成员函数,需要根据整数值调用其他类成员函数,如下所示:

class foo {
public:

foo() {
mTestMap[1] = (*this).test1;
mTestMap[2] = (*this).test2;
mTestMap[3] = (*this).test3;
}

bool test1 () {}
bool test2 () {}
bool test3 () {}

bool execute_test(int test_num) {
if (mTestMap.count(test_num) > 0)
return mTestMap[test_num]();
return false;
}

std::map<int,std::function<bool()>> mTestMap;
};
问题是,此代码导致编译错误:

Error C3867 'foo::test1': non-standard syntax; use '&' to create a pointer to member


我究竟做错了什么?我知道我可以通过指向 std::function的特定对象的指针来分配成员函数。如果 map 和作业发生在类(class)之外,则类似的工作。为什么不从类(class)内部呢?

最佳答案

std::function<bool()>
std::function包装了一个不带参数的可调用对象,该对象返回 bool。这就是这个意思。
bool test1 () {}
您会惊讶地发现这实际上不是一个不带参数的函数,该函数返回 bool。这是 类方法,它不带任何参数并返回 bool(boolean) 值。巨大差距。因此,编译错误。
正确使用这种调度有两种基本方法:
  • 最简单的一种是使用std::bind:
         mTestMap[1] = std::bind(&foo::test1, this);
    mTestMap[2] = std::bind(&foo::test2, this);
    mTestMap[3] = std::bind(&foo::test3, this);

  • 对此的一种变体将使用lambda,但这等同于同一件事。这是最简单的更改。但是,如果此类的实例被复制或移动,那么它将非常非常快地向南移动。
  • 使用类方法指针的映射。这需要更多的工作:
     std::map<int, bool (foo::*)()> mTestMap;

    // ...

    mTestMap[1] = &foo::test1;
    mTestMap[2] = &foo::test2;
    mTestMap[3] = &foo::test3;

    // ...

    bool execute_test(int test_num) {
    if (mTestMap.count(test_num) > 0)
    return (this->*mTestMap[test_num])();
    return false;

  • 使用这种方法,在复制或移动此类的实例后,将减少意外的意外情况。

    关于c++ - 在构造函数中将类成员函数分配给映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64741251/

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