#include<iostream>
struct OtherLibObject {
void* userPointer;
};
template<class T>
class Base {
typedef T type;
};
class Cat :Base<Cat>{
public:
void say() {
std::cout << "nyaaaa\n";
}
};
class Dog {
void say() {
std::cout << "wan\n";
}
};
int main() {
Cat *p = new Cat();
OtherLibObject obj;
obj.userPointer=p;
(Base::type)obj.userPointer->say();
// ((Cat*)(obj.userPointer))->say();
return 0;
}