Я ищу противоположность std::mem_fn
: превращение указателя функции в указатель члена (например, void(*)(C*)
до void(C::*)()
для данного класса C).
Фон
Я использую стороннюю библиотеку (скажем, lib1.h ) для создания привязок для другой сторонней библиотеки ( lib2.h ).
Некоторые функции в lib1.h получают указатели на методы, которые принимают аргумент Value
(также определенный в 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 lib1.h (и реализация таких методов путем получения классов lib2.h , к сожалению, не вариант). Поэтому я чувствую, что приведение к указателям на методы - единственное решение.
Есть ли какой-либо способ сделать это на законных основаниях? Я хотел бы избежать неопределенного поведения, если это возможно.