0

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

例如,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. 对于三参数、四参数等同样如此。

4

2 回答 2

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

希望能帮助到你。

于 2013-01-14T10:25:54.990 回答
1

您不能编写可以指向任何类的成员的成员指针。请记住:成员指针的参数之一是类实例本身。并且指针是有类型的,所以它的参数类型在很大程度上是指针类型的一部分。

但是,您可以使用std::function它,它可以存储各种可调用对象。你将如何实际调用它(即:你给它什么参数)取决于你的需要,因为你没有解释你想要做什么。

于 2013-01-14T10:26:52.510 回答