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

标签 c++ std-function

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

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)内部呢?

最佳答案

std::function<bool()>

std::function 包装了一个可调用对象,该对象不带参数并返回bool。这就是这个意思。

bool test1 () {}

您会惊讶地发现这实际上不是一个不带参数且返回 bool 的函数。它是一个不带参数并返回 bool 值的类方法。巨大差距。因此,编译错误。

有两种正确使用这种调度的基本方法:

  1. 最简单的一种是使用 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/

    相关文章:

    c++ - 使用 TinyXML 解析 XML 元素

    c++ - 函数指针和dll加载顺序

    c++ - 如何使用静态删除器创建 unique_ptr

    c++ - 在不知道声明签名的情况下将任意函数对象存储到类成员容器中

    c++ - 当存储在容器中时,std::function() 到底做了什么?

    c++ - 绑定(bind)到一个weak_ptr

    c++ - 如何初始化没有默认构造函数的对象成员 std::array?

    c++ - 读取文件 int struct 时的 STATUS_ACCESS_VIOLATION

    c++ - 来自 dlsym 的 std::function 导致段错误

    c++ - 包含 std::function<T()> 和 std::function<T(int)> 的映射