c++ - Sum of particular members of an object array -
this first question here, it's 1 (i have searched answer, not found yet).
i have event based disease model written in c++, , i'm trying convert oop (partly own learning experience). basic class (herd) stores numbers of susceptible, infective, , resistant animals, , rates @ possible events occur.
class herd { private: int s,i,r,n; float birth, death, infection, recovery, movement; public: void calc_birth(void) { birth = r*n*(1.0-n/c); } void calc_infection(void) { infection = n>0 ? beta*s*i/n : 0.0; } // etc. }; i have vector of herds keep track of. throughout model need calculate sum of each member across herd, after event changes number or category of individuals in herd (this happens lot). have 4 categories , 5 events, , model expanded , require considerably more.
in old, procedural code, had separate vector each member, , easy create sum() function calculate results, can't see how class without writing separate sum function each member (which possible, doubt it's particularly way of doing it). make static member (e.g. sum_s) track total, , update every time event occurs might not appropriate members, , i'm not sure if total might not wander away true value when comes rates.
is there way write single sum() function, takes member want parameter, , returns sum of particular member across herds?
thank you!
sure, using pointer-to-members.
float sum_for_member( std::vector< herd > const &herds, float herd::*member ) { float acc = 0; ( std:vector< herd >::const_iterator = herds.begin(); != herds.end(); ++ ) { acc += (*it).*member; } return acc; } to call it:
float total_recovery = sum_for_member( my_herds, & herd::recovery ); if want use member function getrecovery instead, parameter declaration becomes float (herd::*member)() , summation becomes acc += ((*it).*member)().
if you're not afraid further oo , generic c++ style, can use function template , let standard library take care of loop:
template< float herd::*member > float plus( float lhs, herd const &rhs ) { return lhs + rhs.*member; } vector< herd > h; std::accumulate( h.begin(), h.end(), 0., plus< & herd::recovery > );
Comments
Post a Comment