Динамические прокси-классы в C ++. Является ли это возможным?

Прежде всего, позвольте мне сказать, что я не гуру C ++ программист. У меня есть несколько лет опыта в C ++, но моя основная область — .NET / C #.

Я ищу способ создания динамических классов прокси / оболочки в C ++. В частности, я хочу добиться перехвата вызова метода. Подобные приемы распространены в мире Java / .NET, но в C ++ отсутствует Reflection.

Я нашел онлайн-учебник, который объясняет, как создать оболочку и перехватить вызовы метода через -> перегрузка оператора:

class Person{
std::string mName;
Person(std::string pName): mName(name){}
void printName(){
std::cout << mName << std::endl;
}

};

template <class T >
class Wrap {
T * p ;
public:
Wrap (T * pp ) :p (pp) { }
Call_proxy <T> operator ->() {
prefix ();
return Call_proxy<T>(p);
}
};
template <class T >
class Call_proxy {
T * p ;
public :
Call_proxy (T * pp ) :p (pp ){ }
˜Call_proxy () {
suffix ();
}
T * operator ->() {
return p ;
}
};

Как видно из этого примера, мы можем отлавливать события вызовов методов до и после вызова, но что мне не ясно, как определить, какой метод вызывается? Это вообще возможно?

Спасибо

ОБНОВИТЬ

Хорошо, чтобы прояснить ситуацию, мне все равно, будет ли реализация действительно динамичной или нет. Мне нравится иметь класс-оболочку, похожий на умные указатели.

4

Решение

Нет. Это разработано специально для того, чтобы быть не навязчивым. Все, что делает обертка, — это облегчает вызов префикса и суффикса, а затем возвращает объект, на который ссылаются, чтобы он мог вызвать указанную функцию. Если оператор -> перегружен, то object-> function () раскрывается в object.operator -> () -> function ().

Вот ссылка на статью, которую написал Страуструп, она очень информативна http://www.stroustrup.com/wrapper.pdf

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]