Учитывая указатель объекта c ++ и совместимый указатель метода на виртуальный метод, существует ли какой-либо удаленно надежный / переносимый способ получить указатель на фактическую концертную функцию, которая будет вызвана?
Случай использования заключается в том, что я хочу запустить указанный указатель с помощью символов отладки, чтобы получить имя типа / функции, которая будет вызвана (без фактического вызова).
Если это возможно только с помощью решений, специфичных для реализации, то я в первую очередь заинтересован в поддержке GCC / LLVM.
LLVM и GCC следуют Itanium C ++ ABI, поэтому вам нужно найти способ прочитать структуры данных, как указано в них. Я дам грубую схему.
Указатель на виртуальный член представлен смещением в таблице виртуальных функций, +1 по некоторым причинам.
class A {
public:
virtual void f();
virtual void g();
};
void (A::*pAg)() = & A::g;
ptrdiff_t offset = *(ptrdiff_t*)(&pAg) - 1;
Указатель на виртуальную таблицу обычно расположен в начале объекта:
A a;
void* vtable = *(void**)&a;
Затем вы смотрите на вычисленное смещение в этой виртуальной таблице и находите фактический указатель на функцию.
void* function = *(void**)(vtable+offset)
Других решений пока нет …