Hej udviklere,
en ting der er tilbagevendende i min kode er at bruge iteratorer til at gå gennem en STL container og gøre noget. Et eksempel:
void RangeSimulation::step()
{
//...
for (std::list<Species *>::iterator iter = community.begin(); iter != community.end(); ++iter)
{
if (goExtinct(*iter)) makeExtinct(*iter);
else
{
if (selectSpecies(*iter)) speciate(*iter);
else next_community.push_back(*iter);
}
//...
}
Jeg kan forstå at det i virkeligheden er den slags man har STL algoritmerne til. Jeg ville gerne lære at bruge en fornuftig syntax med STL algoritmer i stedet for altid at skulle bruge de tunge iteratorer, så det kunne ligne noget a la:
void RangeSimulation::extinctAndSpeciate(Species * spec)
{
if (goExtinct(spec)) makeExtinct(spec);
else
{
if (selectSpecies(spec)) speciate(spec);
else next_community.push_back(spec);
}
}
void RangeSimulation::step()
{
//...
for_each(community.begin(), community.end(), extinctAndSpeciate);
//...
}
Hvor jeg prøver at bruge en funktionspointer til en memberfunktion (af RangeSimulation, ikke Species). Problemet er at min compiler (TDM GCC for Windows) ikke vil acceptere denne syntax.
Jeg kunne tænke mig at løse det med et funktionsobjekt:
void RangeSimulation::extinctAndSpeciate::operator()(Species * spec)
{
if (goExtinct(spec)) makeExtinct(spec);
else
{
if (selectSpecies(spec)) speciate(spec);
else next_community.push_back(spec);
}
}
void RangeSimulation::step()
{
//...
for_each(community.begin(), community.end(), extinctAndSpeciate());
//...
}
Problemet er at functoren nu ikke har adgang til mit RangeSimulation objekt, så det compiler heller ikke. Og hvis jeg lægger functoren ud i namespacet ryger min indkapsling af RangeSimulation klassen også.
Spørgsmålet er, helt generelt: hvordan bruger jeg STL algoritmer med callback (for_each, transform etc.) i memberfunktioner? Der er formentlig en etableret syntaks, jeg blot ikke kender, da dette må være særdeles almindeligt.
På forhånd mange tak!
Indlæg senest redigeret d. 16.03.2010 14:25 af Bruger #8249