我有一个类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();
}
答案 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
};