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

标签 c++ winapi visual-studio-2010

我正在尝试理解一个概念和一个错误。这有什么问题吗?

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

private:
    void func(int) {}
}

我的问题是,是否可以创建任何类型的对象来调用特定实例的成员,其中 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);

};

我想我在使用 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);

};

如果有人能解释这些巨大的神秘错误的含义以及如何修复它们,我将不胜感激。

最佳答案

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

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

std::function<void(int)> testFunc(std::bind(&A::func, this, _1));

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

关于c++ - 具有非静态成员函数的 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10022789/

相关文章:

java - 从包含最大和的整数数组中提取子数组的算法

c - 使用 pthread_kill() 有危险吗?

c# - 为什么我需要 Default.aspx.designer.cs 文件?

c++ - 为什么资源文件中 "Save"之后的空格被去掉了?

.net -/LinkResource 在 Visual Studio 2010 中

c++ - 检查对象是否是带有模板的类的实例

C# 等效于 C++ ostream::tellp 用于磁盘上的大小限制

python - 尝试在 Python 3 中使用 C++ 类时出错

c++ - 关闭#pragma deprecated 警告的 Win 编译开关是什么?

winapi - 回调中的Win32 API向量问题