Дано:
interface ISome
{
virtual void f1()=0;
virtual void f2()=0;
virtual void f3()=0;
virtual void operator()()=0;
};
// нужно получить что-то подобное
// либо в виде енума:
enum E_ISomeOffsets
{
eOff_f1 = 0x0, // индекс для f1()
eOff_f1 = 0x2, // индекс для f3()
eOff_operator_braked = 0x3, // индекс для operator()()
};
// либо в виде макроса:
#define __OFF_ISome_f1__ 0x0
#define __OFF_ISome_f3__ 0x2
#define __OFF_ISome_operator_braked__ 0x3
Т.е. задача сводится к вычислению на/перед этапе/этапом компиляции смещений для виртуальных функций —
нужно по заданным интерфейсам сгенерировать величины смещения для указанных методов.
Перегруженных методов нет, наследование пока не рассматриваем.
У кого какие мысли?
Поделитесь пожалуйста
A_D>Т.е. задача сводится к вычислению на/перед этапе/этапом компиляции смещений для виртуальных функций -
A_D>нужно по заданным интерфейсам сгенерировать величины смещения для указанных методов.
A_D>Перегруженных методов нет, наследование пока не рассматриваем.
A_D>У кого какие мысли? Поделитесь пожалуйста
Если бы не operator(), то решение задачи на языке C
typedef struct ISomeVtbl
{
void (__stdcall *f1)();
void (__stdcall *f2)();
void (__stdcall *f3)();
} ISomeVtbl;
interface ISome
{
const struct ISomeVtbl* Vtbl;
};
C_ASSERT( sizeof(((ISomeVtbl*)NULL)->f1) == sizeof(((ISomeVtbl*)NULL)->f2) );
C_ASSERT( sizeof(((ISomeVtbl*)NULL)->f1) == sizeof(((ISomeVtbl*)NULL)->f3) );
#define __OFF_ISome_f1__ (FIELD_OFFSET(ISomeVtbl, f1)/sizeof(((ISomeVtbl*)NULL)->f1))
#define __OFF_ISome_f2__ (FIELD_OFFSET(ISomeVtbl, f2)/sizeof(((ISomeVtbl*)NULL)->f1))
#define __OFF_ISome_f3__ (FIELD_OFFSET(ISomeVtbl, f3)/sizeof(((ISomeVtbl*)NULL)->f1))
Если интерфейс ISome был описан в idl файле (вряд ли из-за operator()), то описание интерфейса на C и описание на языке С++ находятся в одном файле.