如何将成员函数作为参数传递给不期望它的函数?

时间:2014-11-01 18:29:47

标签: c++ bind function-pointers member-function-pointers

说我有一个函数foo

void foo(void (*ftn)(int x))
{
  ftn(5);
}

它需要一个void函数作为参数,它接受一个int作为参数。考虑

void func1(int x) {}

class X {
public:
  void func2(int x) {}
};

现在 foo(&func1)没问题。

但是foo(&X::func2)不正常,因为X::func2不是静态的,需要一个上下文对象,而且它的函数指针 type 是不同的。

我在foo(std::bind(&X:func2, this))内尝试了X,但这也引发了类型不匹配。

这样做的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

根据评论,如果你不能改变foo的签名除了原始函数指针之外的任何东西......那么你将不得不这样做:

struct XFunc2Wrapper {
    static X* x;

    static void func2(int v) {
        x->func2(v);
    }
};

然后,只要将foo(&XFunc2Wrapper::func2)设置为XFunc2Wrapper::x,就行X。它不必嵌套在结构中,它可以只是一些全局指针,但嵌套有助于更好地建立代码背后的意图。

但这绝对应该是最后的手段(根据Obvlious船长)试图做foo(std::function<void(int)> )