函数指针从一个类到任何类的成员函数

时间:2013-01-14 10:04:41

标签: c++ c++11

我在定义一个可以指向任何成员函数的函数指针时遇到困难(不仅仅是指定类的成员函数)。

例如,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的参数。类似地,对于三个参数,四个参数等

2 个答案:

答案 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;
}

Output

0
1

希望它有所帮助。

答案 1 :(得分:1)

您无法编写可指向任何类成员的成员指针。请记住:成员指针的一个参数是类实例本身。并且指针是键入的,因此其参数的类型是指针类型的一部分。

可以使用std::function但是,它可以存储各种类型的callables。你怎么称呼它(即:你给它的参数)取决于你的需要,因为你还没有解释你想要做什么。