#include <iostream>
#include <memory>
// Macros make the call much more readable: http://w...content-available-to-author-only...t.com/c++-faq-lite/pointers-to-members.html#faq-33.6
#define CALL_MEMBER_FN(object, ptrToMember) ((object).*(ptrToMember))
template <class T>
struct Second
{
// Typedefs make this much more readable: http://w...content-available-to-author-only...t.com/c++-faq-lite/pointers-to-members.html#faq-33.5
typedef void (T::*SecondTriggeredCallback)(void);
// You'll also need an *instance* of the "T" class
Second(SecondTriggeredCallback SecondTriggered, T& t)
{
CALL_MEMBER_FN(t, SecondTriggered)();
}
};
class First
{
public:
First()
:second(nullptr)
{
std::cout << "first class was created" << std::endl;
second.reset(new Second<First>(&First::SecondTriggered, *this));
}
void SecondTriggered()
{
std::cout << "second class was created and responded" << std::endl;
}
private:
std::unique_ptr<Second<First>> second;
};
int main()
{
First first;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgoKLy8gTWFjcm9zIG1ha2UgdGhlIGNhbGwgbXVjaCBtb3JlIHJlYWRhYmxlOiBodHRwOi8vdy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4udC5jb20vYysrLWZhcS1saXRlL3BvaW50ZXJzLXRvLW1lbWJlcnMuaHRtbCNmYXEtMzMuNgojZGVmaW5lIENBTExfTUVNQkVSX0ZOKG9iamVjdCwgcHRyVG9NZW1iZXIpICgob2JqZWN0KS4qKHB0clRvTWVtYmVyKSkKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBTZWNvbmQKewogICAgLy8gVHlwZWRlZnMgbWFrZSB0aGlzIG11Y2ggbW9yZSByZWFkYWJsZTogaHR0cDovL3cuLi5jb250ZW50LWF2YWlsYWJsZS10by1hdXRob3Itb25seS4uLnQuY29tL2MrKy1mYXEtbGl0ZS9wb2ludGVycy10by1tZW1iZXJzLmh0bWwjZmFxLTMzLjUKICAgIHR5cGVkZWYgdm9pZCAoVDo6KlNlY29uZFRyaWdnZXJlZENhbGxiYWNrKSh2b2lkKTsKCiAgICAvLyBZb3UnbGwgYWxzbyBuZWVkIGFuICppbnN0YW5jZSogb2YgdGhlICJUIiBjbGFzcwogICAgU2Vjb25kKFNlY29uZFRyaWdnZXJlZENhbGxiYWNrIFNlY29uZFRyaWdnZXJlZCwgVCYgdCkKICAgIHsKICAgICAgICBDQUxMX01FTUJFUl9GTih0LCBTZWNvbmRUcmlnZ2VyZWQpKCk7CiAgICB9Cn07CgpjbGFzcyBGaXJzdAp7CnB1YmxpYzoKICAgIEZpcnN0KCkKICAgICAgICA6c2Vjb25kKG51bGxwdHIpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJmaXJzdCBjbGFzcyB3YXMgY3JlYXRlZCIgPDwgc3RkOjplbmRsOwogICAgICAgIHNlY29uZC5yZXNldChuZXcgU2Vjb25kPEZpcnN0PigmRmlyc3Q6OlNlY29uZFRyaWdnZXJlZCwgKnRoaXMpKTsKICAgIH0KCiAgICB2b2lkIFNlY29uZFRyaWdnZXJlZCgpCiAgICB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJzZWNvbmQgY2xhc3Mgd2FzIGNyZWF0ZWQgYW5kIHJlc3BvbmRlZCIgPDwgc3RkOjplbmRsOwogICAgfQoKcHJpdmF0ZToKICAgIHN0ZDo6dW5pcXVlX3B0cjxTZWNvbmQ8Rmlyc3Q+PiBzZWNvbmQ7Cn07CgppbnQgbWFpbigpCnsKICAgIEZpcnN0IGZpcnN0Owp9Cg==