Информация об изменениях

Сообщение Re[5]: Приведение указателей на функции-члены и вызов от 04.12.2019 12:43

Изменено 04.12.2019 12:46 Videoman

Re[5]: Приведение указателей на функции-члены и вызов
Здравствуйте, niralex:

Ну так std::function шаблон, но он зависит только от сигнатуры вызова, так что связывайте что хотите когда хотите, если я правильно понял что нужно:
struct Proxy
{
    std::function<int (int param)> handler;

    int Call(int param) { return handler(param); }
};

struct Stub
{
    int Callee(int param) { return param; }
};

Допустим есть два объекта: Proxy — через него вызываем, Stub — что вызываем.
// ...Дальше где-то создаем эти объекты:
Stub stub;
Proxy proxy;
// ...дальше где хотим связываем как хотим
proxy.handler = [&stub](int param) { return stub.Callee(param); }; // Связывает тут что хотим с чем хотим
// ...дальше вызываем
assert(proxy.Call(123) == 123);

В лямбду можно запихнуть что угодно, в том числе умный хендлер, который при разрушении будем освобождать ресурсы, например ту же dll.
Re[5]: Приведение указателей на функции-члены и вызов
Здравствуйте, niralex:

Ну так std::function шаблон, но он зависит только от сигнатуры вызова, так что связывайте что хотите когда хотите, если я правильно понял что нужно:
struct Proxy
{
    std::function<int (int param)> handler;

    int Call(int param) { return handler(param); }
};

struct Stub
{
    int Callee(int param) { return param; }
};

Допустим есть два объекта: Proxy — через него вызываем, Stub — что вызываем.
// ...Дальше где-то создаем эти объекты:
Stub stub;
Proxy proxy;
// ...дальше где хотим связываем как хотим
proxy.handler = [&stub](int param) { return stub.Callee(param); }; // Связывает тут что хотим с чем хотим
// ...дальше вызываем
assert(proxy.Call(123) == 123);
// или так
assert(proxy.handler(123) == 123);

В лямбду можно запихнуть что угодно, в том числе умный хендлер, который при разрушении будем освобождать ресурсы, например ту же dll.