Здравствуйте, MTimur, Вы писали:
MT>Очевидное решение — изменить someforeignfunc так, чтобы принимала pma, но эта функция "не моя".
MT>Понимаю, что никак, но надеюсь, что ошибаюсь
Можно с рядом ограничений.
1) Синглетон
// присвой нужные значения перед вызовом
static A* object;
static pma method;
void invoke() { (object->*method)(); }
Нельзя одновременно создавать произвольное количество РАЗНЫХ замыканий.
Хотя, можно завести пул функций invoke1, invoke2, ... — и для каждой свой комплект статических данных.
2) Санки
struct Thunk
{
char bytecode[XZ];
void generate(A* object, pma method)
{
// здесь рожаем байткод для функции invoke()
// в который подставляем значения object и method
}
pa get_invoke() { return (pa)bytecode; }
};
Это платформенно-зависимый подход. Для разных процессоров — разная реализация.
Используется в ATL, кстати. Можно попробовать оттуда выдрать.