#include <iostream>
using namespace std;
class Worker;
class SomeClass
{
void* data;
public:
template<class T> void* GetData(const T*)
{
enum { eTEST_FRIEND = T::eFRIEND_SOMECLASS };
return data;
}
};
struct IWorker
{
enum { eFRIEND_SOMECLASS =1 };
};
class Worker1:public IWorker
{
SomeClass* object;
public:
void doSomeWork(){ clear(object->GetData(this)); }
void clear(void*) { cout<<"Worker1: clear data success\n"; }
};
class Worker2:public IWorker
{
SomeClass* object;
public:
void doSomeWork(){ clear(object->GetData(this)); }
void clear(void*) { cout<<"Worker2: clear data success\n"; }
};
int main() {
// your code goes here
Worker1().doSomeWork();
Worker2().doSomeWork();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgV29ya2VyOwoKY2xhc3MgU29tZUNsYXNzCnsKICAgIHZvaWQqIGRhdGE7CnB1YmxpYzoKICAgIHRlbXBsYXRlPGNsYXNzIFQ+IHZvaWQqIEdldERhdGEoY29uc3QgVCopCiAgICB7CiAgICAgICAgZW51bSB7IGVURVNUX0ZSSUVORCA9IFQ6OmVGUklFTkRfU09NRUNMQVNTIH07CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICB9Cn07CgpzdHJ1Y3QgSVdvcmtlcgp7CgllbnVtIHsgZUZSSUVORF9TT01FQ0xBU1MgPTEgfTsKfTsKCmNsYXNzIFdvcmtlcjE6cHVibGljIElXb3JrZXIKewogICAgU29tZUNsYXNzKiBvYmplY3Q7CnB1YmxpYzoKICAgIHZvaWQgZG9Tb21lV29yaygpeyBjbGVhcihvYmplY3QtPkdldERhdGEodGhpcykpOyAgfQogICAgdm9pZCBjbGVhcih2b2lkKikgeyBjb3V0PDwiV29ya2VyMTogY2xlYXIgZGF0YSBzdWNjZXNzXG4iOyB9Cn07CgpjbGFzcyBXb3JrZXIyOnB1YmxpYyBJV29ya2VyCnsKICAgIFNvbWVDbGFzcyogb2JqZWN0OwpwdWJsaWM6CiAgICB2b2lkIGRvU29tZVdvcmsoKXsgY2xlYXIob2JqZWN0LT5HZXREYXRhKHRoaXMpKTsgIH0KICAgIHZvaWQgY2xlYXIodm9pZCopIHsgY291dDw8IldvcmtlcjI6IGNsZWFyIGRhdGEgc3VjY2Vzc1xuIjsgfQp9OwoKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCgkKCQoJV29ya2VyMSgpLmRvU29tZVdvcmsoKTsKCVdvcmtlcjIoKS5kb1NvbWVXb3JrKCk7CgkKCXJldHVybiAwOwp9