#include <iostream>
template <typename T>
class A
{
private:
T val1;
T val2;
public:
T getVal1()
{
return val1;
}
void setVal1(T aVal)
{
val1 = aVal;
}
T getVal2()
{
return val2;
}
void setVal2(T aVal)
{
val2 = aVal;
}
};
template <typename T>
class B
{
private:
A<T>* aPtr;
B(const B&); // TODO , disallow for now
B& operator=(const B&); // TODO , disallow for now
public:
B() : aPtr(new A<T>()) {}
~B() { delete aPtr; }
A<T>* getAPtr()
{
return aPtr;
}
T operator[](const int& key)
{
if(key == 0)
{
T res = getAPtr()->getVal1();
return res;
}
else
{
T res = getAPtr()->getVal2();
return res;
}
}
};
int main()
{
B<int> foo;
foo.getAPtr()->setVal1(1);
int x = foo[0];
std::cout << foo[0] << " " << x << std::endl; // 1 1
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmNsYXNzIEEKewpwcml2YXRlOgogICAgVCB2YWwxOwogICAgVCB2YWwyOwoKcHVibGljOgogICAgVCBnZXRWYWwxKCkKICAgIHsKICAgICAgICByZXR1cm4gdmFsMTsKICAgIH0KICAgIHZvaWQgc2V0VmFsMShUIGFWYWwpCiAgICB7CiAgICAgICAgdmFsMSA9IGFWYWw7CiAgICB9CiAgICBUIGdldFZhbDIoKQogICAgewogICAgICAgIHJldHVybiB2YWwyOwogICAgfQogICAgdm9pZCBzZXRWYWwyKFQgYVZhbCkKICAgIHsKICAgICAgICB2YWwyID0gYVZhbDsKICAgIH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBCCnsKcHJpdmF0ZToKICAgIEE8VD4qIGFQdHI7CgogICAgQihjb25zdCBCJik7ICAgICAgICAgICAgLy8gVE9ETyAsIGRpc2FsbG93IGZvciBub3cKICAgIEImIG9wZXJhdG9yPShjb25zdCBCJik7IC8vIFRPRE8gLCBkaXNhbGxvdyBmb3Igbm93CgpwdWJsaWM6CglCKCkgOiBhUHRyKG5ldyBBPFQ+KCkpIHt9Cgl+QigpIHsgZGVsZXRlIGFQdHI7IH0KCiAgICBBPFQ+KiBnZXRBUHRyKCkKICAgIHsKICAgICAgICByZXR1cm4gYVB0cjsKICAgIH0KICAgIFQgb3BlcmF0b3JbXShjb25zdCBpbnQmIGtleSkKICAgIHsKICAgICAgICBpZihrZXkgPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIFQgcmVzID0gZ2V0QVB0cigpLT5nZXRWYWwxKCk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIFQgcmVzID0gZ2V0QVB0cigpLT5nZXRWYWwyKCk7CiAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgfQogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgICBCPGludD4gZm9vOwogICAgZm9vLmdldEFQdHIoKS0+c2V0VmFsMSgxKTsKICAgIGludCB4ID0gZm9vWzBdOwogICAgc3RkOjpjb3V0IDw8IGZvb1swXSA8PCAiICIgPDwgeCA8PCBzdGQ6OmVuZGw7IC8vIDEgMQp9Cg==