C ++接受成员和外部函数指针

时间:2015-07-05 11:07:34

标签: c++ function pointers

我有一个类Alpha和一个函数pointFun,它应该同时接受Alpha成员函数和通用外部函数(例如:在main中定义)。

我已覆盖pointFun以使Alpha成员函数和外部函数都可用。但由于pointFun函数实际上很长,我想避免重复两次。

有没有办法接受两种函数指针类型?我尝试这样做(参见代码的注释部分),但它没有用。

// fpointer.h

#include <iostream>
using std::cout;
using std::endl;

class Alpha {
    public:
        Alpha() {}

        void pointFun (void (Alpha::*fun)());
        void pointFun (void (*fun)());
        //void pointFun (void (*funA)(), void (Alpha::*funB)()); // <-- how to make THIS instead of the previous two?
        void printA   ();
        void assignF  ();

    private:
         int value;
        bool set;
};

void Alpha::pointFun(void (Alpha::*fun)()) {
    (Alpha().*fun)();
}

void Alpha::pointFun(void (*fun)()) {
    (*fun)();
}

/* // I want this:
void Alpha::pointFun(void (*funA)() = 0, void (Alpha::*funB)() = 0) {
    (*funA)();
    (Alpha().*funB)();
    // same code, different pointer functions
}
*/

void Alpha::printA() {
    cout << "A" << endl;
    // some long code
}

void Alpha::assignF () {
    pointFun(&Alpha::printA);
}

这是主要的:

// MAIN.cpp

#include <iostream>
#include "fpointer.h"
using namespace std;

void printB() {
    cout << "B" << endl;
    // same long code as before
}

int main() {
    Alpha A;
    A.pointFun(printB);
    A.assignF();
}

2 个答案:

答案 0 :(得分:1)

不确定

struct Foo
{
    using Fn = R(T1, T2, T3);

    R execute(Fn * f, T1 a1, T2 a2, T3 a3)
    //        ^^^^^^
    //        free pointer
    {
        return f(a1, a2, a3);
    }

    R execute(Fn Foo:: *f, T1 a1, T2 a2, T3 a3)
    //        ^^^^^^^^^^^
    //        pointer-to-member
    {
        return (this->*f)(a1, a2, a3);
    }

    // e.g.
    R you_can_call_me(T1, T2, T3);
};

R i_am_free(T1, T2, T3);

R dispatch(bool b, Foo & x, T1 a1, T2 a2, T3 a3)
{
    if (b) { x.execute(&i_am_free, a1, a2, a3); }
    else   { x.execute(&Foo::you_can_call_me, a1, a2, a3); }
}

答案 1 :(得分:1)

您可以创建一个方法,该方法需要std::function并转发给您的特殊情况:

class Alpha {
public:
    void pointFun (std::function<void()> f); // Long function definition

    void pointFun (void (Alpha::*fun)()) { pointFun([this, fun](){(this->*fun)();}); }

// Other stuff
};