Вы можете объявить свой метод traverse()
для принятия любого вызываемого типа для посетителя, например:
template < class KeyType, class ItemType, class VisitorType >
void HashedDictionary< KeyType, ItemType>::traverse(VisitorType visit) const {
HashedEntry<KeyType, ItemType> *currPtr;
for (int i = 0; i < hashTableSize; i++) {
currPtr = hashTable[i];
while (currPtr) {
ItemType currItem = currPtr->getItem();
visit(currItem);
currPtr = currPtr->getNext();
}
}
}
Затем вы можете передать функтор или функцию, например:
struct visit {
int month;
visit (int mon) : month(mon) {}
void operator()(Person& p) {
if (p.getMonth() == month) {
cout << p.getName() << ": " << p.getMonth() << "/" << p.getDay() << "/" << p.getYear() << endl;
}
}
};
d->traverse(visit(4));
void visitIfApril(Person& p) {
if (p.getMonth() == 4) {
cout << p.getName() << ": " << p.getMonth() << "/" << p.getDay() << "/" << p.getYear() << endl;
}
}
d->traverse(visitIfApril);
template<const int month>
void visitIf(Person& p) {
if (p.getMonth() == month) {
cout << p.getName() << ": " << p.getMonth() << "/" << p.getDay() << "/" << p.getYear() << endl;
}
}
d->traverse(visitIf<4>);
В C ++ 11 и более поздних версиях вы также можете передать лямбду вместо:
d->traverse(
[](Person& p) {
if (p.getMonth() == 4) {
cout << p.getName() << ": " << p.getMonth() << "/" << p.getDay() << "/" << p.getYear() << endl;
}
}
);
Альтернативой является предоставление traverse()
дополнительного пользовательского параметра для последующей передачи в функцию обратного вызова, например:
template < class KeyType, class ItemType, class UserType >
void HashedDictionary< KeyType, ItemType>::traverse(void visit(ItemType&), UserType user) const {
HashedEntry<KeyType, ItemType> *currPtr;
for (int i = 0; i < hashTableSize; i++) {
currPtr = hashTable[i];
while (currPtr) {
ItemType currItem = currPtr->getItem();
visit(currItem, user);
currPtr = currPtr->getNext();
}
}
}
void visit(Person& p, int month) {
if p.getMonth() == month) {
cout << p.getName() << ": " << p.getMonth() << "/" << p.getDay() << "/" << p.getYear() << endl;
}
}
d->traverse(visit, 4);