class Small { public: void foo(); void bar(int x); // and many more functions }; class Big { public: void foo() { for (size_t i = 0; i < VectorOfSmalls.size(); i++) VectorOfSmalls[i]->foo(); } void bar(int x) { for (size_t i = 0; i < VectorOfSmalls.size(); i++) VectorOfSmalls[i]->bar(x); } // and many more functions private: vector VectorOfSmalls; }; void Big::call_command(const string & command) { for (size_t i = 0; i < VectorOfSmalls.size(); i++) { if (command == "foo") VectorOfSmalls[i]->foo(); else if (command == "bar") VectorOfSmalls[i]->bar(); } } void Big::foo() { call_command("foo"); } void foo() { std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(&Small::foo)); } void bar() { std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(&Small::bar)); } class Big { public: enum Command { DO_FOO, DO_BAR }; void doit(Command cmd) { switch(cmd) { case DO_FOO: std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(&Small::foo)); break; case DO_BAR: std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(&Small::bar)); break; } }; class Big { public: template void doit() { std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(fn)); } }; Big b; b.doit<&Small::foo>(); b.doit<&Small::bar>(); #include #include #include #include class Small { public: void foo() { std::cout << "foo" << std::endl; } void bar(int x) { std::cout << "bar" << std::endl; } }; class Big { public: template void doit() { std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::mem_fun(fn)); } template void doit(T x) { std::for_each(VectorOfSmalls.begin(), VectorOfSmalls.end(), std::bind2nd(std::mem_fun(fn), x)); } public: std::vector VectorOfSmalls; }; int main() { Big b; b.VectorOfSmalls.push_back(new Small); b.VectorOfSmalls.push_back(new Small); b.doit<&Small::foo>(); b.doit(5); } void Big::call_command(const boost::function& f) { for (size_t i = 0; i < VectorOfSmalls.size(); i++) { f(VectorOfSmalls[i]); } } int main() { Big b; b.call_command(boost::bind(&Small::foo, _1)); b.call_command(boost::bind(&Small::bar, _1, 5)); }