Операторы выбора могут почти всегда заменяться полиморфизмом.
public class NormalCustomer extends Customer {
public boolean isInvestible() {
return getSavingsAccount().getBalance() > 1e6;
}
}
public class PreferredCustomer extends Customer {
public boolean isInvestible() {
return isCeo();
}
}
Этот подход упростит клиентский код. Клиентский код не должен знать детали того, как "investibility" вычисляется, и он больше не должен повреждаться Закон Demeter путем рытья в состояние Клиентского объекта.
Ваше решение верное.
Чтобы отделить тип графика от посетителя, вы можете передать конструктору посетителя только карту интересных свойств и получить доступ к его элементам, используя boost :: get (property, u) = s3d :: cV :: leaf;
. Таким образом, вы можете передать посетителю любое свойство вершины, совместимое с типом (посетитель будет более общим и не будет иметь смысла называть изменения в типе графа).
Тип для карты свойств будет именем типа шаблона для класса посетителя и будет выглядеть примерно так:
typedef property_map<graph_t, s3d_cv3_leaf_t your_vertex_info::*>::type your_property_map;
См. здесь для полной диссертации о связанных свойствах.
HTH
Я только изучаю этот материал, но я Считаю правильным, что вы должны хранить ссылку на график в посетителе. Я' m не уверен, что это по этой причине, но это может быть потому, что они не хотели предоставлять две версии всех функций / требовали, чтобы производные предоставляли две версии каждой функции. Особенно, когда доступен обходной путь через график.
Даже если это покажется странным, я думаю, что передача ссылки на график может быть «правильным путем».