我在定义一个可以指向任何成员函数的函数指针时遇到困难(不仅仅是指定类的成员函数)。
例如,C ++强制我指定一个指向成员函数的函数指针所指向的类:
typedef void (Foo::*MyFunctionPointerTypeName)(int);
但是如果这个函数指针要指向的类成员函数不在Foo
中呢?那我怎么写这个,或者我可以使用哪种替代方法?
更新:对于任何想要快速回答如何使用C ++ 11 std::function
完成此任务的人(因为有关该主题的教程似乎假设了很多读者):
定义(来自Foo
内):
std::function<void(int)> _fun;
绑定(来自任何类):
objFoo->_fun = std::bind(&SomeOtherClass::memberFunction,
this, std::placeholders::_1);
调用它(从Foo
内)
if(_fun != nullptr) _fun(42);
如果您的功能没有参数,则可以删除std::placeholders::_1
。如果您的函数有两个参数,则还需要 std::placeholders::_2
作为std::bind
的参数。类似地,对于三个参数,四个参数等
答案 0 :(得分:1)
使用继承:
#include <iostream>
struct Foo {};
struct Bar : public Foo
{
int F0()
{
return 0;
}
};
struct Baz : public Foo
{
int F1()
{
return 1;
}
};
int main(int argc, char **argv)
{
int (Bar::*pF0)() = &Bar::F0;
int (Baz::*pF1)() = &Baz::F1;
int (Foo::*pointer1)() = static_cast<int (Foo::*)()>(pF0);
int (Foo::*pointer2)() = static_cast<int (Foo::*)()>(pF1);
Bar r;
Baz z;
// Pointer to Foo member function calling Bar member function
std::cout << (r.*pointer1)() << '\n';
// Pointer to Foo member function calling Baz member function
std::cout << (z.*pointer2)() << '\n';
return 0;
}
0
1
希望它有所帮助。
答案 1 :(得分:1)
您无法编写可指向任何类成员的成员指针。请记住:成员指针的一个参数是类实例本身。并且指针是键入的,因此其参数的类型是指针类型的一部分。
你可以使用std::function
但是,它可以存储各种类型的callables。你怎么称呼它(即:你给它的参数)取决于你的需要,因为你还没有解释你想要做什么。