我必须在C ++中提出类似下面的内容。
我在下面的课程中有一个成员函数。
class myClass {
public:
void myFunc();
};
我在另一个库中有以下函数,我应该调用它并传递一个回调函数,它是对象的myFunc()
void AnotherFunction((void*)(pCallback)())
{
// Here I will call back function
}
我怎样才能实现上述目标?我知道一个类的静态函数来传递回调,但在这里我必须确保函数是线程安全的。如果不使用静态,我怎样才能达到这个要求?
答案 0 :(得分:4)
目前,“最佳”解决方案是呕吐异常。
void f(void(*fp)()) { fp(); }
void mah_func() {
try {
throw;
} catch(my_class* m) {
m->func();
}
}
int main() {
my_class m;
try {
throw &m;
} catch(my_class* p) {
f(mah_func);
}
}
这是一种恶心的滥用,但是线程安全且最便携。
答案 1 :(得分:-1)
在内部,成员函数总是将this-pointer作为“不可见”的第一个参数,因此你的函数将具有签名void(myClass *)。如果您可以将AnotherFunction的签名更改为void AnotherFunction(std::function<void()> callback)
,则可以执行以下操作:
#include <functional>
#include <iostream>
void AnotherFunction(std::function<void()> callback)
{
callback();
}
void fun()
{
std::cout << "fun()" << std::endl;
}
class Foo
{
public:
Foo(int i) : i_(i) { }
static void gun()
{
std::cout << "Foo::gun()" << std::endl;
}
void hun()
{
std::cout << "Foo(" << i_ << ")::hun()" << std::endl;
}
protected:
private:
int i_;
};
int main()
{
Foo foo(666);
AnotherFunction(fun);
AnotherFunction(Foo::gun);
AnotherFunction(std::bind(&Foo::hun, foo));
}
打印:
fun()
Foo::gun()
Foo(666)::hun()