繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM