fork download
  1. #include <iostream>
  2. #include <vector>
  3.  
  4. class ClassB
  5. {
  6. public:
  7. void SetThingie(const std::string &str);
  8. void DoSomething(float f, int i);
  9. };
  10.  
  11. class ClassA
  12. {
  13. public:
  14. ClassA(int objCount)
  15. {
  16. this->objects.resize(objCount);
  17. }
  18.  
  19. template<typename MemberFunc, typename ...Args>
  20. typename std::enable_if<std::is_member_function_pointer<MemberFunc>::value, void>::type
  21. CallMemberFuncOnObjects(MemberFunc memberFunc, Args&& ...args)
  22. {
  23. int id = 0;
  24.  
  25. for(auto &object : this->objects)
  26. {
  27. std::cout << "ClassB #" << ++id << " = ";
  28. (object.*memberFunc)( args... );
  29. }
  30.  
  31. std::cout << std::endl;
  32. }
  33.  
  34. private:
  35. std::vector<ClassB> objects;
  36. };
  37.  
  38. void ClassB::SetThingie(const std::string &str)
  39. {
  40. std::cout << str << std::endl;
  41. }
  42.  
  43. void ClassB::DoSomething(float f, int i)
  44. {
  45. std::cout << "(" << f << ", " << i << ")" << std::endl;
  46. }
  47.  
  48. int main()
  49. {
  50. ClassA myClassA(5);
  51.  
  52. myClassA.CallMemberFuncOnObjects(&ClassB::SetThingie, "Hello world!");
  53. myClassA.CallMemberFuncOnObjects(&ClassB::DoSomething, 3.14f, 357);
  54.  
  55. return 0;
  56. }
Success #stdin #stdout 0s 3432KB
stdin
Standard input is empty
stdout
ClassB #1 = Hello world!
ClassB #2 = Hello world!
ClassB #3 = Hello world!
ClassB #4 = Hello world!
ClassB #5 = Hello world!

ClassB #1 = (3.14, 357)
ClassB #2 = (3.14, 357)
ClassB #3 = (3.14, 357)
ClassB #4 = (3.14, 357)
ClassB #5 = (3.14, 357)