#include <iostream>
#include <vector>
class ClassB
{
public:
void SetThingie(const std::string &str);
void DoSomething(float f, int i);
};
class ClassA
{
public:
ClassA(int objCount)
{
this->objects.resize(objCount);
}
template<typename MemberFunc, typename ...Args>
typename std::enable_if<std::is_member_function_pointer<MemberFunc>::value, void>::type
CallMemberFuncOnObjects(MemberFunc memberFunc, Args&& ...args)
{
int id = 0;
for(auto &object : this->objects)
{
std::cout << "ClassB #" << ++id << " = ";
(object.*memberFunc)( args... );
}
std::cout << std::endl;
}
private:
std::vector<ClassB> objects;
};
void ClassB::SetThingie(const std::string &str)
{
std::cout << str << std::endl;
}
void ClassB::DoSomething(float f, int i)
{
std::cout << "(" << f << ", " << i << ")" << std::endl;
}
int main()
{
ClassA myClassA(5);
myClassA.CallMemberFuncOnObjects(&ClassB::SetThingie, "Hello world!");
myClassA.CallMemberFuncOnObjects(&ClassB::DoSomething, 3.14f, 357);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgQ2xhc3NCCnsKcHVibGljOgogICAgdm9pZCBTZXRUaGluZ2llKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpOwogICAgdm9pZCBEb1NvbWV0aGluZyhmbG9hdCBmLCBpbnQgaSk7Cn07CgpjbGFzcyBDbGFzc0EKewpwdWJsaWM6CglDbGFzc0EoaW50IG9iakNvdW50KQoJewoJCXRoaXMtPm9iamVjdHMucmVzaXplKG9iakNvdW50KTsKCX0KCQoJdGVtcGxhdGU8dHlwZW5hbWUgTWVtYmVyRnVuYywgdHlwZW5hbWUgLi4uQXJncz4KCXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfbWVtYmVyX2Z1bmN0aW9uX3BvaW50ZXI8TWVtYmVyRnVuYz46OnZhbHVlLCB2b2lkPjo6dHlwZQogICAgQ2FsbE1lbWJlckZ1bmNPbk9iamVjdHMoTWVtYmVyRnVuYyBtZW1iZXJGdW5jLCBBcmdzJiYgLi4uYXJncykKICAgIHsKICAgIAlpbnQgaWQgPSAwOwogICAgCQogICAgCWZvcihhdXRvICZvYmplY3QgOiB0aGlzLT5vYmplY3RzKQogICAgCXsKICAgIAkJc3RkOjpjb3V0IDw8ICJDbGFzc0IgIyIgPDwgKytpZCA8PCAiID0gIjsKICAgIAkJKG9iamVjdC4qbWVtYmVyRnVuYykoIGFyZ3MuLi4gKTsKICAgIAl9CiAgICAJCiAgICAJc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKICAgIH0KCnByaXZhdGU6CiAgICBzdGQ6OnZlY3RvcjxDbGFzc0I+IG9iamVjdHM7Cn07Cgp2b2lkIENsYXNzQjo6U2V0VGhpbmdpZShjb25zdCBzdGQ6OnN0cmluZyAmc3RyKQp7CiAgICBzdGQ6OmNvdXQgPDwgc3RyIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBDbGFzc0I6OkRvU29tZXRoaW5nKGZsb2F0IGYsIGludCBpKQp7CglzdGQ6OmNvdXQgPDwgIigiIDw8IGYgPDwgIiwgIiA8PCBpIDw8ICIpIiA8PCBzdGQ6OmVuZGw7Cn0KCmludCBtYWluKCkKewoJQ2xhc3NBIG15Q2xhc3NBKDUpOwoJCglteUNsYXNzQS5DYWxsTWVtYmVyRnVuY09uT2JqZWN0cygmQ2xhc3NCOjpTZXRUaGluZ2llLCAiSGVsbG8gd29ybGQhIik7CglteUNsYXNzQS5DYWxsTWVtYmVyRnVuY09uT2JqZWN0cygmQ2xhc3NCOjpEb1NvbWV0aGluZywgMy4xNGYsIDM1Nyk7CgkKCXJldHVybiAwOwp9