Первоначально требовалось, чтобы все вызовы функций-членов для всех моих классов происходили через прокси-класс (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;
}