我正在寻找与std::mem_fn
相反的内容:将功能指针转换为成员指针(例如,给定类C的void(*)(C*)
至void(C::*)()
)。
我正在使用第三方库(例如lib1.h)为另一个第三方库(lib2.h)创建绑定。
/* lib1.h (can't touch this) */
class Value;
class Property;
template <typename C>
struct ObjectWrap {
using Method = void(C::*)(Value);
static Property declare(std::string name, Method method);
};
/* lib2.h (can't touch this) */
struct Person {
void greet(std::string name);
};
/* bindings.cpp */
std::string value_to_std_string(Value v);
Property declarePersonGreet() {
return ObjectWrap<Person>::declare("greet",
/* ERROR */ [](Person* p, Value v) {
p->greet(value_to_std_string(v));
});
}
我非常有信心,我不会滥用的API(不幸的是,通过派生lib2.h的类来实现此类方法不是一种选择)。因此,我认为强制转换为方法指针是唯一的解决方案。是否有任何合法方法?我想尽可能避免未定义的行为。lib1.h
我正在寻找与std :: mem_fn相反的东西:将函数指针变成成员指针(例如,对于给定的C类,void(*)(C *)变为void(C :: *)())。背景我正在使用第三方库(例如...
void(Person::*)(Value)
,也无法使用,因为Person
没有这样的方法。如果lib1期望成员函数为C
的类型为void(C::)(Value)
,则无法通过相应的方法来提供此类C
。您可以为Person
写一个包装器: