У меня есть класс, который должен вызывать метод посетителя для каждой переменной-члена. Что-то вроде этого:
class A{
int a, b, c;
public:
void accept(Visitor &visitor){
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
};
Как я могу получить метод void accept() const
с тем же кодом без дублирования кода?
Очевидным решением с дублированием является добавление метода:
void accept(Visitor &visitor) const {
visitor.visit(a);
visitor.visit(b);
visitor.visit(c);
}
Этот метод имеет именно то значение, которое мне нужно, но я хотел бы избежать дублирования кода. Причина использования обоих методов заключается в том, чтобы иметь возможность читать переменные «читающим» посетителем и иметь accept
метод const
. Тогда неконстантный accept
можно будет использовать для «записи/обновления» посетителей.
visit
? Если это константа, то нет необходимости в неконстантнойaccept
. Если это не так, то этоaccept
не может быть константой. - person Beta   schedule 10.03.2011const
на текущий методaccept
? Зачем вам нужна неконстантная версия accept? - person Tim   schedule 10.03.2011visit()
перегружен дляconst
и не-const
. - person Oliver Charlesworth   schedule 10.03.2011Visitor::visit
может быть перегружен для параметраconst int&
иint&
, причем последний потенциально может изменить посещаемую вещь. Не уверен, что это мудро, но текущий дублированный код спрашивающего позволяет это сделать. - person Steve Jessop   schedule 10.03.2011accept(...) const
иaccept(const Visitor&)
есть большая разница. С неконстантным посетителем мы бы вызвали неконстантныйVisitor::visit()
- независимо от того, является лиaccept()
константным или неконстантным. - person Tim   schedule 10.03.2011Visitor::visit(const int &)
иVisitor::visit(int &)
. - person Oliver Charlesworth   schedule 10.03.2011Visitor
не такой. - person Tim   schedule 10.03.2011visit(a)
изменяетthis->a
, а не передает его по значению. Я могу с этим смириться, тем более что он позволяет простое совместное использование кода для нескольких таких функций посетителя. Именование функций по-другому может по-прежнему работать, если шаблон принимает дополнительный аргумент шаблона указателя на функцию-член, и может помочь некоторым читателям, поэтому я не уверен. - person Steve Jessop   schedule 10.03.2011