2014-11-01 89 views
0

说我有一个功能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也不是一成不变的,需要上下文对象及其函数指针是不同的。

我试过foo(std::bind(&X:func2, this))X里面,但这也引起类型不匹配。

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

+0

考虑改变你的函数,把'std :: function'作为它的参数。这样你可以使用'std :: bind'来透明地使用一个自由函数,静态成员函数或者非静态成员函数。 – 2014-11-01 18:32:13

+0

模板函数foo最有可能是最简单的解决方案。编辑:是的,如上所述,更简单的可能是std :: function – Creris 2014-11-01 18:32:15

+0

如果我不允许更改'foo'(库的一部分)怎么办? – batman 2014-11-01 18:39:52

回答

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)>)

相关问题