У меня есть список объектов, где мне нужно вызвать функцию-член — пока ничего особенного: перебрать список, сделать этот вызов — готово.
Теперь у меня есть несколько мест, которые делают почти то же самое в одном и том же списке, за исключением того, что вызываемая функция-член меняется (аргумент всегда один и тот же, двойное значение).
Я немного пробовал с std::function, но в итоге не смог заставить его работать. Какие-либо предложения? (Я вернулся к С++ после многих лет работы с С#, так что многое забыл).
Вот как это выглядит сейчас:
void CMyService::DoSomeListThingy(double myValue)
{
for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
{
(*v_Iter)->MethodToBeCalled(myValue);
}
}
void CMyService::DoSomeThingDifferent(double myValue)
{
for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
{
(*v_Iter)->CallTheOtherMethod(myValue);
}
}
И вот как я бы предпочел:
void CMyService::DoSomeListThingy(double myValue)
{
ApplyToList(&CMyListItem::MethodToBeCalled, myValue);
}
void CMyService::DoSomeThingDifferent(double myValue)
{
ApplyToList(&CMyListItem::CallTheOtherMethod, myValue);
}
void CMyService::ApplyToList(std::function<void(double)> func, double myValue)
{
for (std::list<CMyListItem*>::iterator v_Iter = myList.begin(); v_Iter != myList.end(); ++v_Iter)
{
(*v_Iter)->func(myValue);
}
}