#include <iostream>
using namespace std;
class AbstractArray{ //<-- new class
public: virtual void* get(int index)=0;
};
template<class T1> class MyArray : public AbstractArray{ //<-- modify
T1* internal[20];
public: T1* get(int index){return internal[index];}
public: void set(int index,T1* t1){internal[index]=t1;}
};
template<class T2> class User{
public: AbstractArray* arrayPtr;
public: T2* getTheBestT2(){
int bestIndex=0;
//.... some code to find the "bestIndex" ....
void* t1=arrayPtr->get(bestIndex);
T2* t2=static_cast<T2*>(t1);
return t2;
}
};
class Animal{public: int testAnimal=42;};
class Dog:public Animal{public: int testDog=41;};
int main() {
User<Dog> user;
MyArray<Animal> array;
array.set(0,new Dog());
user.arrayPtr = &array;
Dog* dog=user.getTheBestT2();
std::cout<<dog->testDog<<std::endl;
std::cout<<dog->testAnimal<<std::endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQWJzdHJhY3RBcnJheXsgICAvLzwtLSBuZXcgY2xhc3MKICAgICBwdWJsaWM6IHZpcnR1YWwgdm9pZCogZ2V0KGludCBpbmRleCk9MDsKfTsKCnRlbXBsYXRlPGNsYXNzIFQxPiBjbGFzcyBNeUFycmF5IDogcHVibGljIEFic3RyYWN0QXJyYXl7IC8vPC0tIG1vZGlmeQoJVDEqIGludGVybmFsWzIwXTsKCXB1YmxpYzogVDEqIGdldChpbnQgaW5kZXgpe3JldHVybiBpbnRlcm5hbFtpbmRleF07fQoJcHVibGljOiB2b2lkIHNldChpbnQgaW5kZXgsVDEqIHQxKXtpbnRlcm5hbFtpbmRleF09dDE7fQp9Owp0ZW1wbGF0ZTxjbGFzcyBUMj4gY2xhc3MgVXNlcnsKCXB1YmxpYzogQWJzdHJhY3RBcnJheSogYXJyYXlQdHI7CglwdWJsaWM6IFQyKiBnZXRUaGVCZXN0VDIoKXsKCQlpbnQgYmVzdEluZGV4PTA7CgkJLy8uLi4uIHNvbWUgY29kZSB0byBmaW5kIHRoZSAiYmVzdEluZGV4IiAuLi4uCgkJdm9pZCogdDE9YXJyYXlQdHItPmdldChiZXN0SW5kZXgpOwoJCVQyKiB0Mj1zdGF0aWNfY2FzdDxUMio+KHQxKTsgCgkJcmV0dXJuIHQyOwoJfQp9OwpjbGFzcyBBbmltYWx7cHVibGljOiBpbnQgdGVzdEFuaW1hbD00Mjt9OwpjbGFzcyBEb2c6cHVibGljIEFuaW1hbHtwdWJsaWM6IGludCB0ZXN0RG9nPTQxO307CmludCBtYWluKCkgewoJVXNlcjxEb2c+IHVzZXI7CglNeUFycmF5PEFuaW1hbD4gYXJyYXk7CglhcnJheS5zZXQoMCxuZXcgRG9nKCkpOwoJdXNlci5hcnJheVB0ciA9ICZhcnJheTsKCURvZyogZG9nPXVzZXIuZ2V0VGhlQmVzdFQyKCk7CglzdGQ6OmNvdXQ8PGRvZy0+dGVzdERvZzw8c3RkOjplbmRsOwoJc3RkOjpjb3V0PDxkb2ctPnRlc3RBbmltYWw8PHN0ZDo6ZW5kbDsKCXJldHVybiAwOwp9