Предположим, у меня есть класс:
class Widget {
public:
void initialize() {
// hurr-durr
};
int computeAnswer() {
return -42;
};
std::string getQuestion() {
return "The question";
};
};
Он выполняет некоторые вычисления, может делать все, что захочет.
Теперь я хочу дополнить его — применить аспект, скажем, тот, который регистрирует каждый вызов метода.
Если бы я реализовал это вручную, я бы реализовал все методы следующим образом:
int LoggingWidget::computeAnswer(){
log << 'Calling method computeAnswer';
int result = Widget::computerAnswer();
log << 'Result = ' << result;
return result;
}
Я хотел бы, чтобы решение было как можно более общим (я не хочу вручную переадресовывать все вызовы), поэтому возможные варианты использования могут включать одно из этих (в зависимости от того, что возможно)
Widget* w = new LoggingWidget(); // either a class that inherits from Widget
// and automatically forwards all calls.
Widget* w = new Logging<Widget>(); // or a template that does this.
так что когда я позвоню
int result = w.computeAnswer();
Звонки будут регистрироваться. Возможно, здесь может пригодиться новый оператор многоточия (...
)?