传递extern函数作为参数的最佳和安全方式是没有boost的类的函数?

时间:2012-03-05 21:00:55

标签: c++ function function-pointers

我有以下代码:

#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的类函数的最佳和安全方法是什么?

2 个答案:

答案 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之类的自动变量作为回调传递是一个非常糟糕的主意,因为很难确定指针是否仍然存在在最终调用回调时有效)