我有以下代码:
#include <iostream>
typedef void ( *FuncPtr )( int );
extern void MyFunc( FuncPtr callback )
class MyClass
{
public:
void SomeFunction( int n )
{
std::cout << "bla: " << n << std::endl;
}
};
int main()
{
MyClass obj;
MyFunc( /* */ );
}
将MyFunc
函数作为参数传递给没有(SomeFunction
)boost的类函数的最佳和安全方法是什么?
答案 0 :(得分:2)
你不能,即使你的编译器允许它,我相信你会进入未定义的行为。
SomeFunction
不像是一个自由函数,它是一个成员函数。这意味着它在一个对象上运行,因此在上下文之外调用它是一条确定的灾难之路。
答案 1 :(得分:2)
C回调的习惯用法是包含用户数据,它通过函数传递任意参数并返回回调:
typedef void ( *FuncPtr )( int, uintptr_t user_data );
extern void MyFunc( FuncPtr callback, uintptr_t user_data );
在使用回调的类上调用方法时,使用user_data
传递this
指针:
class MyClass
{
public:
void SomeFunction( int n )
{
std::cout << "bla: " << n << std::endl;
}
private:
static void SomeFunctionEntry( int n, uintptr_t user_data)
{
MyClass *ths = (MyClass *) user_data;
ths->SomeFunction(n);
}
};
静态函数SomeFunctionEntry
是一个自由函数,可以作为回调调用。您确保其user_data
参数是有效的类实例:
int main()
{
MyClass obj;
MyFunc(&MyClass::SomeFunctionEntry, (uintptr_t) &obj);
}
(旁注:在多线程环境中将obj
之类的自动变量作为回调传递是一个非常糟糕的主意,因为很难确定指针是否仍然存在在最终调用回调时有效)