Я написал метод класса, используя STL find_if
.Код следующий:
void
Simulator::CommunicateEvent (pEvent e)
{
pwEvent we (e);
std::list<pEvent> l;
for (uint32_t i = 0; i < m_simulatorObjects.size (); i++)
{
l = m_simulatorObjects[i]->ProcessEvent (we);
// no action needed if list is empty
if (l.empty ())
continue;
// sorting needed if list comprises 2+ events
if (l.size () != 1)
l.sort (Event::Compare);
std::list<pEvent>::iterator it = m_eventList.begin ();
std::list<pEvent>::iterator jt;
for (std::list<pEvent>::iterator returnedElementIt = l.begin ();
returnedElementIt != l.end ();
returnedElementIt++)
{
// loop through the array until you find an element whose time is just
// greater than the time of the element we want to insert
Simulator::m_eventTime = (*returnedElementIt)->GetTime ();
jt = find_if (it,
m_eventList.end (),
IsJustGreater);
m_eventList.insert (jt, *returnedElementIt);
it = jt;
}
}
}
К сожалению, позже я обнаружил, что машина, на которой будет выполняться код, оснащена библиотекой libstdc ++ версии 4.1.1-21, которой, по-видимому, не хватает find_if
.Само собой разумеется, я не могу обновить библиотеку, и при этом я не могу попросить кого-то сделать это.
При компиляции я получаю ошибку:
simulator.cc: In member function ‘void sim::Simulator::CommunicateEvent(sim::pEvent)’:
simulator.cc:168: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
simulator.cc: In static member function ‘static void sim::Simulator::InsertEvent(sim::pEvent)’:
simulator.cc:191: error: no matching function for call to ‘find_if(std::_List_iterator<boost::shared_ptr<sim::Event> >&, std::_List_iterator<boost::shared_ptr<sim::Event> >, sim::Simulator::<anonymous struct>&)’
make: *** [simulator.o] Error 1
Как я могу решить проблему?
Я думал, что смогу определить функцию find_if
, как описано здесь .Тем не менее, у меня есть некоторые проблемы:
- А как насчет производительности?Функция, которая использует find_if, должна быть максимально эффективной.
- Как мне выполнить условную компиляцию?Я не смог найти макрос, сообщающий версию установленной libstdc ++.
Что вы думаете об этом?TIA, Jir
Ссылки
Исходные файлы: simulator.h и simulator.cc
Решение
Определяется IsJustGreater
вне класса Simulator
и объявляется IsJustGreater_s
другом Simulator
:
struct IsJustGreater_s : public std::unary_function<const pEvent, bool> {
inline bool operator() (const pEvent e1) {return (e1->GetTime () > Simulator::m_eventTime);}
} IsJustGreater;
Вызывается IsJustGreater
в find_if
следующим образом: jt = find_if (it, m_eventList.end (), sim :: IsJustGreater);