如何合法地将函数指针转换为方法指针?

问题描述 投票:1回答:1

我正在寻找与std::mem_fn相反的内容:将功能指针转换为成员指针(例如,给定类Cvoid(*)(C*)void(C::*)())。

背景

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

Value参数(也在lib1.h中定义)的方法的方法指针。另一方面,lib2.h类不包含此类方法,因此我必须通过lambda函数手动进行包装:/* 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的类来实现此类方法不是一种选择)。因此,我认为强制转换为方法指针是唯一的解决方案。是否有任何合法方法?我想尽可能避免未定义的行为。

我正在寻找与std :: mem_fn相反的东西:将函数指针变成成员指针(例如,对于给定的C类,void(*)(C *)变为void(C :: *)())。背景我正在使用第三方库(例如...

c++ pointers function-pointers member-function-pointers
1个回答
2
投票
不,你不能做这样的演员。即使可以得到void(Person::*)(Value),也无法使用,因为Person没有这样的方法。如果lib1期望成员函数为C的类型为void(C::)(Value),则无法通过相应的方法来提供此类C。您可以为Person写一个包装器:
© www.soinside.com 2019 - 2024. All rights reserved.