Portál AbcLinuxu, 12. května 2025 07:28
struct A{ virtual int compute(int foo){ /* výpočet A */ } }; struct B: public A{ virtual int compute(int foo){ /* výpočet B */ } }; vector<objekt*> objekty; // naplnit pole etc. for(int i=0; i<100000; i++){ // tady se pro každý objekt v každém kroku resolvuje virtuální funkce, přitom výsledek pro kažedý objekt vždy stejný BOOST_FOREACH(const objekt*, objekty){ sum+=objekt->compute(bar); } }kde je nějaká množina objektů, na kterých se compute mnohokrát opakovaně volá. Nový scénář:
struct A{ typedef boost::function<int(int)> computePtrT; computePtrT compuptePtr; int computeA(int foo){ /* výpočet A */ } // neni virtualni! virtual computePtrT getComputePtr(){ return boost::bind(&A::computeA,this,_1); } }; struct B: public A{ int computeB(int foo){ /* výpočet B */ } // neni virtualni virtual computePtrT getComputePtr(){ return boost::bind(&B::computeB,this,_1); } }; for(int i=0; i<100000; i++){ BOOST_FOREACH(const objekt*, objekty){ // při prvním cyklu se voláním virtuální funkce nastaví pointer na nevirtuální funkci (computeA nebo computeB) if(!objekt->computePtr) objekt->computePtr=objekt->getComputePtr(); sum+=objekt->computePtr(bar); } }Díky za komentáře.
Řešení dotazu:
boost::function
při volání používá virtuální funkci.
boost::function
při volání používá virtuální funkci.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.