我正在尝试理解一个概念和一个错误。这有什么问题吗?
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/