#include <typeinfo>
#include <string>
#include <map>
#include <iostream>
template< typename T >
class declare_type
{
static int n;
};
struct GenericClassFactory
{
~GenericClassFactory() {};
virtual void* create( const std::string& rstrClassName ) = 0;
};
template <typename T>
struct ClassFactory : public GenericClassFactory
{
virtual void* create( const std::string& rstrClassName )
{
return new T();
}
};
class ClassRegister
{
public:
virtual ~ClassRegister()
{ // ...
}
template< typename T >
static int declare( const std::string& rstrClassName = typeid(T).name() )
{
std::cout << "ClassRegister::declare( " << rstrClassName << " )\n";
return 42;
}
static void create( const std::string& rstrClassName )
{
std::cout << "ClassRegister::create( " << rstrClassName << " )\n";
}
private:
};
template< typename T >
int declare_type<T>::n = ClassRegister::declare<T>();
template< typename T >
class BaseClass
{
declare_type<T> m_declaration;
};
class SomeClass : public BaseClass<SomeClass>
{
public:
void meow();
};
//template class declare_type<SomeClass>;
int main( void )
{
ClassRegister::create( "9SomeClass" );
return 0;
}
I2luY2x1ZGUgPHR5cGVpbmZvPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8aW9zdHJlYW0+Cgp0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CmNsYXNzIGRlY2xhcmVfdHlwZQp7CiAgICBzdGF0aWMgaW50IG47Cn07CgoKc3RydWN0IEdlbmVyaWNDbGFzc0ZhY3RvcnkKewogICAgfkdlbmVyaWNDbGFzc0ZhY3RvcnkoKSB7fTsKICAgIHZpcnR1YWwgdm9pZCogY3JlYXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgcnN0ckNsYXNzTmFtZSApID0gMDsKfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpzdHJ1Y3QgQ2xhc3NGYWN0b3J5IDogcHVibGljIEdlbmVyaWNDbGFzc0ZhY3RvcnkKewogICAgdmlydHVhbCB2b2lkKiBjcmVhdGUoIGNvbnN0IHN0ZDo6c3RyaW5nJiByc3RyQ2xhc3NOYW1lICkKICAgIHsKICAgICAgICByZXR1cm4gbmV3IFQoKTsKICAgIH0KfTsKCmNsYXNzIENsYXNzUmVnaXN0ZXIKewpwdWJsaWM6CiAgICB2aXJ0dWFsIH5DbGFzc1JlZ2lzdGVyKCkKICAgIHsgLy8gLi4uCiAgICB9CgogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgogICAgc3RhdGljIGludCBkZWNsYXJlKCBjb25zdCBzdGQ6OnN0cmluZyYgcnN0ckNsYXNzTmFtZSA9IHR5cGVpZChUKS5uYW1lKCkgKQogICAgewogICAgCXN0ZDo6Y291dCA8PCAiQ2xhc3NSZWdpc3Rlcjo6ZGVjbGFyZSggIiA8PCByc3RyQ2xhc3NOYW1lIDw8ICIgKVxuIjsKICAgIAlyZXR1cm4gNDI7CiAgICB9CgogICAgc3RhdGljIHZvaWQgY3JlYXRlKCBjb25zdCBzdGQ6OnN0cmluZyYgcnN0ckNsYXNzTmFtZSApCiAgICB7CiAgICAJc3RkOjpjb3V0IDw8ICJDbGFzc1JlZ2lzdGVyOjpjcmVhdGUoICIgPDwgcnN0ckNsYXNzTmFtZSA8PCAiIClcbiI7CiAgICB9Cgpwcml2YXRlOgp9OwoKdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgppbnQgZGVjbGFyZV90eXBlPFQ+OjpuID0gQ2xhc3NSZWdpc3Rlcjo6ZGVjbGFyZTxUPigpOwoKCnRlbXBsYXRlPCB0eXBlbmFtZSBUID4gCmNsYXNzIEJhc2VDbGFzcwp7CiAgICBkZWNsYXJlX3R5cGU8VD4gbV9kZWNsYXJhdGlvbjsKfTsKCmNsYXNzIFNvbWVDbGFzcyA6IHB1YmxpYyBCYXNlQ2xhc3M8U29tZUNsYXNzPgp7CnB1YmxpYzoKICAgIHZvaWQgbWVvdygpOwp9OwoKLy90ZW1wbGF0ZSBjbGFzcyBkZWNsYXJlX3R5cGU8U29tZUNsYXNzPjsKCmludCBtYWluKCB2b2lkICkKewoJQ2xhc3NSZWdpc3Rlcjo6Y3JlYXRlKCAiOVNvbWVDbGFzcyIgKTsKCQoJcmV0dXJuIDA7Cn0=