我正在尝试将任何通用函数作为C ++函数中的参数传递。作为额外的乐趣,该函数将驻留在其自己的单独类中。在这种特殊情况下,它们都将不接受任何参数并返回void
。这包括任何泛型类的成员。
我当前的代码如下:
class functionsFedHere {
public:
void (*callback)();
functionsFedHere(void(*)());
}
functionsFedHere::functionsFedHere (void(*callbackFunction)()) {
callback = callbackFunction;
}
void fn1() { cout<<"Fn1"<<endl; }
class myClass {
public:
int i;
void fn2() { cout<<i<<endl; }
}
class myOtherClass {
public:
string j;
void fn3() { cout<<j<<endl; }
}
int main() {
// Initialise some objects
myClass b;
b.i = 2;
myOtherClass c;
c.j = "some text";
// Works fine with non-member functions
functionsFedHere objectA(fn1);
objectA.callback();
// Doesn't work with member functions
functionsFedHere objectB(b.fn2);
functionsFedHere objectC(c.fn3);
}
我见过诸如转发功能或boost :: bind之类的解决方案,但据我所知,我认为这些解决方案不适合吗?
值得注意的是,最终我还是希望通过指针数组传递成员函数。例如,如果myPointer[]
是指向class对象的指针的数组myClass
,那么能够编写类似以下内容的代码将是一件很不错的事情:
functionsFedHere objectD(myPointer[0]->fn2);
编辑:显然我还不够清楚。这个答案不是一个合适的答案,因为我希望将成员函数和非成员函数都作为参数传递(而建议的答案是设置指向属于同一类成员的函数的成员指针)。
我认为转发函数示例不起作用,因为转发函数采用单个类类型,我想在其中传递通用类的对象。
boost::bind
答案很可能;我只是不熟悉。谁能指出我一些适合新手的阅读材料?
编辑2:对不起,忘了提及我在C ++ 11之前的设备上进行编程。
用途std::function
:
class functionsFedHere {
public:
typedef std::function<void()> Func;
Func callback;
functionsFedHere(Func callback_) : callback(callback_) {}
};
void fn1() { cout<<"Fn1"<<endl; }
class myClass {
public:
int i;
void fn2() { cout<<i<<endl; }
};
class myOtherClass {
public:
string j;
void fn3() { cout<<j<<endl; }
};
class callableClass {
public:
void operator()() { std::cout << "in callableClass" << std::endl; }
};
int main() {
// Initialise some objects
myClass b;
b.i = 2;
myOtherClass c;
c.j = "some text";
// Works fine with non-member functions
functionsFedHere objectA(fn1);
objectA.callback();
// Works with member functions now
functionsFedHere objectB(std::bind(&myClass::fn2, b));
objectB.callback();
functionsFedHere objectC(std::bind(&myOtherClass::fn3, c));
objectC.callback();
// Works with lambdas as well
functionsFedHere objectLambda([]() { std::cout << "in lambda" << std::endl; });
objectLambda.callback();
// Works also with classes with overloaded operator()
functionsFedHere(callableClass()).callback();
return 0;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句