具有非静态成员函数的std :: function

Fat*_*sis 11 c++ winapi visual-studio-2010

我试图理解一个概念和一个错误.这有什么问题?

class A
{
public:
    A()
    {
        std::function<void(int)> testFunc(&A::func);
    }

private:
    void func(int) {}
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,是否可以创建任何类型的对象,该对象能够调用特定实例的成员,其中std :: function的作用类似于成员函数指针,除非没有不能用作函数参数的古怪类型定义继承类.例如:

class A
{
public:
    A()
    {
         index[WM_CREATE] = &A::close;
         index[WM_DESTROY] = &A::destroy;
    }

protected:
    map<UINT msg, void (A::*)(HWND, UINT , WPARAM, LPARAM)> index;
    void close(HWND,UINT, WPARAM, LPARAM);
    void destroy(HWND, UINT, WPARAM, LPARAM);
};

class B : public A
{
public:
    B()
    {
        index[WM_CREATE] = &B::create; // error because it's not a pointer of type A::*
    }
private:
    void create(HWND, UINT, WPARAM, LPARAM);

};
Run Code Online (Sandbox Code Playgroud)

我在想我正在使用std :: functions这样的正确轨道:

class A
{
public:             //         Gigantic stl error with these two
    A()             //                         |
    {               //                         V
         index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::close);
         index[WM_DESTROY] = std::function<void(HWND, UINT, WPARAM, LPARAM>(&A::destroy);
    }

protected:
    map<UINT msg, std::function<void(HWND, UINT, WPARAM, LPARAM)> > index;
    void close(HWND,UINT, WPARAM, LPARAM);
    void destroy(HWND, UINT, WPARAM, LPARAM);
};

class B : public A
{
public:                    //               and this one
    B()                    //                     |
    {                      //                     V
        index[WM_CREATE] = std::function<void(HWND, UINT, WPARAM, LPARAM)>(&B::create);
    }
private:
    void create(HWND, UINT, WPARAM, LPARAM);

};
Run Code Online (Sandbox Code Playgroud)

如果有人能够解释这些巨大的神秘错误是什么意思以及如何解决它们,我将非常感激.

Jas*_*n B 14

我认为你遇到的问题是成员函数不仅需要一个函数指针,还需要一个指向调用对象的指针.换句话说,成员函数有一个额外的隐式参数,它是指向调用对象的指针.

要将成员函数设置为std :: function,您需要像这样使用std :: bind:

std::function<void(int)> testFunc(std::bind(&A::func, this, _1));
Run Code Online (Sandbox Code Playgroud)

这会将当前A实例的this指针绑定到函数,因此它具有函数指针和对象实例,这是正确调用函数的足够信息._1参数表示在调用函数时将提供第一个显式参数.

  • 是的,一个下划线.您可能需要为每个参数使用`std :: placeholders :: _ 1`等. (2认同)