说我有一个函数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
,但这也引发了类型不匹配。
这样做的正确方法是什么?
答案 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)> )
。