[英]How to legally cast function pointer to method pointer?
我正在寻找与std::mem_fn
相反的内容:将function 指针转换为成员指针(例如void(*)(C*)
到void(C::*)()
对于给定的 class Z0D257F8370DCAD1D411 )。
我正在使用 3rd 方库(例如lib1.h )为另一个 3rd 方库( lib2.h )创建绑定。
lib1.h中的一些函数接收指向接受Value
参数的方法的方法指针(也在lib1.h中定义)。 另一方面, lib2.h类不包含此类方法,因此我必须通过 lambda function 手动进行包装:
/* 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));
});
}
我相当有信心我没有滥用lib1.h的 API (不幸的是,通过派生lib2.h的类来实现这些方法不是一种选择)。 因此,我觉得转换为方法指针是唯一的解决方案。
有没有任何合法的方法可以做到这一点? 如果可能,我想避免未定义的行为。
不,你不能做这样的演员。 即使你能得到一个void(Person::*)(Value)
,你也不能使用它,因为Person
没有这样的方法。 如果 lib1 需要一个类型C
和一个成员 function void(C::)(Value)
那么就没有办法为这种类型C
提供相应的方法。 您可以为Person
编写一个包装器:
struct Wrapper {
Person p;
void greet(Value v) {
p.greet(value_to_std_string(v));
}
};
Property declarePersonGreet() {
return ObjectWrap<Wrapper>::declare("greet",&Wrapper::greet);
}
如果您有许多类似于Person
的类,则可以将包装器设为模板:
template <typename T>
struct Wrapper {
T p;
void greet(Value v) {
p.greet(value_to_std_string(v));
}
};
...可能还对成员 function 进行参数化,以在包装的 object 和 function 上调用以用于转换参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.