Нет, вам нужно создать функцию-обертку, которая будет вызывать run()
для любого объекта, который передается в него.В C ++ нет такой динамической диспетчеризации, которая позволит вам использовать строку для ссылки на функцию и искать ее во время выполнения - для вызова for_each должна быть одна и только одна функция по одному адресу, а неполиморфная функция.
Вам не нужно создавать функцию-обертку для каждого объекта: у вас просто есть такая, и она вызывается повторно и передается в объект.Затем вы вызываете run () для переданного объекта, и полиморфизм делает все остальное:
void wrapper(Interface* obj)
{
obj->run();
}
std::for_each(list.begin(), list.end(), wrapper);