Как получить указатель на приватную функцию-член для передачи другу в C ++? - PullRequest
0 голосов
/ 01 июня 2019

Первоначально требовалось, чтобы все вызовы функций-членов для всех моих классов происходили через прокси-класс (Fortress).

Допустим, у меня есть класс «А».Мое решение состояло в том, чтобы сделать все функции-члены в «А» закрытыми и сделать «Крепость» другом «А».Теперь только «Крепость» может вызывать функции-члены «А».

Проблема в том, как я могу попросить 'Fortress' вызвать данную функцию.Мне неудобно использовать решение на основе карт, потому что мне нужна максимальная производительность, которую я могу получить через «Крепость».

Идеальным решением для меня было бы то, что любой внешний класс (скажем, «B») может получить указатель на функцию-член в «A».Но «B» не может вызвать эту функцию напрямую, потому что она закрыта.«B» может связать аргументы и передать эту функцию «Fortress» для вызова.Тем не менее, это невозможно, потому что я даже не могу создать указатель внутри «B», потому что функция является закрытой.

Пример кода пути, на который я направляюсь, указан ниже.Заранее спасибо всем, кто может подсказать мне.

class Fortress;

class A{
public:
    explicit A(std::string  name): m_name(std::move(name)){}

private:
    friend Fortress;
    void setName(const std::string& name) {m_name  = name;}
    std::string getName() { return m_name;};

    std::string m_name;
};

class Fortress{
public:
    template <typename R, typename F>
    R call(F f){
        return static_cast<R>(f());
    }

    template <typename T>
    void call(T t){
        t();
    }
};

int main() {
    auto a = A("Whatever");

    auto fortress = Fortress();

    fortress.call(std::bind(&A::setName, &a, "Hello"));

    std::cout << fortress.call<std::string>(std::bind(&A::getName, &a)) << std::endl;

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...