[英]std::function with non-static member functions
我试图理解一个概念和一个错误。 这有什么问题?
class A
{
public:
A()
{
std::function<void(int)> testFunc(&A::func);
}
private:
void func(int) {}
}
我的问题是,是否可以创建任何类型的 object 来调用特定实例的成员,其中 std::function 的行为类似于成员 function 指针,除非没有不能用作 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);
};
如果有人能解释这些巨大的神秘错误的含义以及如何修复它们,我将不胜感激。
我认为你遇到的问题是成员 function 不仅需要一个 function 指针,还需要一个指向调用 object 的指针。换句话说,成员函数有一个额外的隐式参数,它是指向调用 object 的指针。
要将成员 function 设置为 std::function,您需要像这样使用 std::bind:
std::function<void(int)> testFunc(std::bind(&A::func, this, _1));
这会将当前 A 实例的 this 指针绑定到 function,因此它具有 function 指针和 object 实例,这些信息足以正确调用 function。_1 参数表示当 function 被调用时将提供第一个显式参数叫。
对于 c++11,您还可以使用比std::bind
更易读的 lambda:
index[WM_CREATE] = [this](HWND h, UINT u, WPARAM w, LPARAM l)
{
create(h, u, w, l);
}
我的问题是,是否可以创建能够调用特定实例成员的任何类型的 object
在这种情况下,唯一缺少的信息实际上是std::function
object 应该使用的具体实例: &A::func
不能单独使用(例如(this->*&A::func)(0)
将&A::func
与实例*this
一起使用)。 尝试:
std::function<void(int)> testFunc = std::bind(&A::func, this);
(注意std::bind(&A::func, *this)
和std::bind(&A::func, this)
的语义略有不同。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.