Так, ви хочете передати в 2 лямбда (C ++ 11) або об'єкти, які можна запускати (C ++ 03) у ваш алгоритм "find".
За допомогою C ++ 03 ви можете перейти до двох функцій підвищення, один для випадку "знайдено" та один для випадку "не знайдено".
void search( std::string str,
boost::function ifFound,
boost::function ifNotFound )
{
//search
if( nodePtr != NULL )
{
ifFound();
}
else
{
ifNotFound();
}
}
Виберіть свої підписи для відповідності, але так ви переходите в динамічні функції.
Ви можете використовувати std :: function
замість boost :: function
.
Якщо це саме пошукове середовище, яке ви хочете зробити гнучким, тобто те, яку частину об'єкта ви намагаєтеся зіставити, використовуйте також динамічний предикат.
void search( Pred pred// , ifFound, ,ifNotFound )
{
if( pred( nodePtr ) )//then it is found
}
Пріакатор, як бачите, займе вказівник вузла і поверне true/false. Таким чином, різні судження будуть використовуватися для відповідності різним членам даних.
Хоча вам дійсно подобається поняття "багаторазовий код", я б рекомендував вам використовувати стандартну бібліотеку.
Якщо ваші списки є довгими, і ви постійно виконуєте ці пошуки, пошук вручну відбувається повільно, і ви можете використовувати boost :: multi_index
, щоб створювати пошукові запити часу log-N у різних полях.