#include <iostream>
#include <memory>
#include <map>
template < class X>
X& Singleton( )
{
static X x;
return x;
}
template < class GUID_T, class MAP_T, class T>
class TypeFactory {
protected :
bool ContainsInternal( MAP_T id) {
auto it = types.find ( id) ;
return ( it ! = types.end ( ) ) ;
}
typedef GUID_T GUID;
inline virtual MAP_T GetTypeID( GUID guid) = 0 ;
std:: map < MAP_T, T> types;
public :
void Add( GUID guid, const T & value) {
auto id = GetTypeID( guid) ;
if ( ! ContainsInternal( id) ) {
types.insert ( std:: make_pair ( id, T( value) ) ) ;
}
}
bool Contains( GUID guid) {
return ContainsInternal( GetTypeID( guid) ) ;
}
std:: shared_ptr < T> Get( GUID guid) {
auto id = GetTypeID( guid) ;
std:: shared_ptr < T> result;
auto it = types.find ( id) ;
if ( it ! = types.end ( ) ) {
result = std:: make_shared < T> ( it- > second) ;
}
return result;
}
std:: map < MAP_T, T> & GetAll( ) {
return types;
}
} ;
template < class T>
class IntTypeFactory : public TypeFactory< int , int , T> {
protected :
inline virtual int GetTypeID( GUID guid) {
return guid;
}
} ;
class Type {
public : int a;
} ;
int main( ) {
IntTypeFactory< Type> & Types ( Singleton< IntTypeFactory< Type> > ( ) ) ;
IntTypeFactory< Type> & Types2 ( Singleton< IntTypeFactory< Type> > ( ) ) ;
auto t_in = Type( ) ;
t_in.a = 10 ;
Types.Add ( 1 , t_in) ;
auto t_out = Types2.Get ( 1 ) ;
std:: cout << t_out- > a << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5PgojaW5jbHVkZSA8bWFwPgoKdGVtcGxhdGUgPGNsYXNzIFg+ClgmIFNpbmdsZXRvbigpCnsKICAgIHN0YXRpYyBYIHg7CglyZXR1cm4geDsKfQoKdGVtcGxhdGU8Y2xhc3MgR1VJRF9ULCBjbGFzcyBNQVBfVCwgY2xhc3MgVD4KY2xhc3MgVHlwZUZhY3Rvcnkgewpwcm90ZWN0ZWQ6Cglib29sIENvbnRhaW5zSW50ZXJuYWwoTUFQX1QgaWQpIHsKCQlhdXRvIGl0ID0gdHlwZXMuZmluZChpZCk7CgkJcmV0dXJuIChpdCAhPSB0eXBlcy5lbmQoKSk7Cgl9CgoJdHlwZWRlZiBHVUlEX1QgR1VJRDsKCWlubGluZSB2aXJ0dWFsIE1BUF9UIEdldFR5cGVJRChHVUlEIGd1aWQpID0gMDsKCXN0ZDo6bWFwPE1BUF9ULCBUPiB0eXBlczsKcHVibGljIDoKCXZvaWQgQWRkKEdVSUQgZ3VpZCwgY29uc3QgVCAmIHZhbHVlKSB7CgkJYXV0byBpZCA9IEdldFR5cGVJRChndWlkKTsKCQlpZighQ29udGFpbnNJbnRlcm5hbChpZCkpIHsKCQkJdHlwZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGlkLCBUKHZhbHVlKSkpOwoJCX0KCX0KCglib29sIENvbnRhaW5zKEdVSUQgZ3VpZCkgewoJCXJldHVybiBDb250YWluc0ludGVybmFsKEdldFR5cGVJRChndWlkKSk7Cgl9CgoJc3RkOjpzaGFyZWRfcHRyPFQ+IEdldChHVUlEIGd1aWQpIHsKCQlhdXRvIGlkID0gR2V0VHlwZUlEKGd1aWQpOwoJCXN0ZDo6c2hhcmVkX3B0cjxUPiByZXN1bHQ7CgkJYXV0byBpdCA9IHR5cGVzLmZpbmQoaWQpOwoJCWlmKGl0ICE9IHR5cGVzLmVuZCgpKSB7CgkJCXJlc3VsdCA9IHN0ZDo6bWFrZV9zaGFyZWQ8VD4oaXQtPnNlY29uZCk7CgkJfQoJCXJldHVybiByZXN1bHQ7Cgl9CgoJc3RkOjptYXA8TUFQX1QsIFQ+ICYgR2V0QWxsKCkgewoJCXJldHVybiB0eXBlczsKCX0KfTsKCnRlbXBsYXRlPGNsYXNzIFQ+CmNsYXNzIEludFR5cGVGYWN0b3J5IDogcHVibGljIFR5cGVGYWN0b3J5PGludCwgaW50LCBUPiB7CnByb3RlY3RlZDoKCWlubGluZSB2aXJ0dWFsIGludCBHZXRUeXBlSUQoR1VJRCBndWlkKSB7CgkJcmV0dXJuIGd1aWQ7Cgl9Cn07CmNsYXNzIFR5cGUgewpwdWJsaWM6IGludCBhOwp9OwoKaW50IG1haW4oKSB7CglJbnRUeXBlRmFjdG9yeTxUeXBlPiAmIFR5cGVzIChTaW5nbGV0b248IEludFR5cGVGYWN0b3J5PFR5cGU+ID4oKSk7CglJbnRUeXBlRmFjdG9yeTxUeXBlPiAmIFR5cGVzMiAoU2luZ2xldG9uPCBJbnRUeXBlRmFjdG9yeTxUeXBlPiA+KCkpOwoKCWF1dG8gdF9pbiA9IFR5cGUoKTsKCXRfaW4uYSA9IDEwOwoJVHlwZXMuQWRkKDEsIHRfaW4pOwoJYXV0byB0X291dCA9IFR5cGVzMi5HZXQoMSk7CglzdGQ6OmNvdXQgPDwgdF9vdXQtPmEgPDwgc3RkOjplbmRsOwoJcmV0dXJuIDA7Cn0=
compilation info
prog.cpp:53:31: error: ‘GUID’ has not been declared
prog.cpp:21:23: warning: inline function ‘MAP_T TypeFactory<GUID_T, MAP_T, T>::GetTypeID(TypeFactory<GUID_T, MAP_T, T>::GUID) [with GUID_T = int; MAP_T = int; T = Type; TypeFactory<GUID_T, MAP_T, T>::GUID = int]’ used but never defined [enabled by default]
stdout