C++ 如何合法地将函数指针强制转换为方法指针?

C++ 如何合法地将函数指针强制转换为方法指针?,c++,pointers,function-pointers,member-function-pointers,C++,Pointers,Function Pointers,Member Function Pointers,我正在寻找与std::mem_fn相反的方法:将函数指针转换为成员指针(例如void(*)(C*)到void(C::*)(),对于给定的类C) 背景 我正在使用第三方库(比如lib1.h)为另一个第三方库(lib2.h)创建绑定 lib1.h中的一些函数接收方法指针,指向接受值参数(也在lib1.h中定义)的方法。另一方面,lib2.h类不包含此类方法,因此我必须通过lambda函数手动进行包装: /*lib1.h(不能触摸此)*/ 阶级价值; 阶级属性; 模板 结构对象包装{ 使用方法=无效(

我正在寻找与
std::mem_fn
相反的方法:将函数指针转换为成员指针(例如
void(*)(C*)
void(C::*)()
,对于给定的类C)

背景 我正在使用第三方库(比如lib1.h)为另一个第三方库(lib2.h)创建绑定

lib1.h中的一些函数接收方法指针,指向接受
参数(也在lib1.h中定义)的方法。另一方面,lib2.h类不包含此类方法,因此我必须通过lambda函数手动进行包装:

/*lib1.h(不能触摸此)*/
阶级价值;
阶级属性;
模板
结构对象包装{
使用方法=无效(C::*)(值);
静态属性声明(std::字符串名称、方法);
};
/*lib2.h(不能碰这个)*/
结构人{
void greet(std::字符串名称);
};
/*bindings.cpp*/
std::字符串值\u到\u std\u字符串(值v);
房地产申报单{
返回ObjectWrap::declare(“问候”,
/*错误*/[](个人*p,值v){
p->greet(值到标准字符串(v));
});
}
我很有信心我没有误用lib1.h的API(不幸的是,通过派生lib2.h的类来实现这样的方法不是一种选择)。因此,我觉得转换到方法指针是唯一的解决方案


有没有合法的方法?如果可能的话,我希望避免未定义的行为。

不,你不能这样做。即使您可以得到一个
void(Person::*)(Value)
,您也不能使用它,因为
Person
没有这样的方法。如果lib1希望类型
C
具有成员函数
void(C::)(Value)
,则无法使用相应的方法提供此类类型
C
。您可以为
人员编写包装:

struct Wrapper {    
    Person p;
    void greet(Value v) {
        p.greet(value_to_std_string(v));
    }
};


Property declarePersonGreet() {
  return ObjectWrap<Wrapper>::declare("greet",&Wrapper::greet);
}

…可能还对要在包装对象上调用的成员函数和用于转换参数的函数进行了参数化

更好地定义
属性
声明
需要是公共的。请参见:这里的前提是错误的——<代码> MimyFn < /C++ >不将成员指针转换为函数指针,它将它封装在可调用对象内。在C++中有一种模仿扩展方法的简单方法,但是我建议不要在实际代码中使用该技术。
template <typename T>
struct Wrapper {    
    T p;
    void greet(Value v) {
        p.greet(value_to_std_string(v));
    }
};