Search code examples
c++xmlqtloadxmlreader

Get type from xml QT 4.8 C++


I made this program where you have some kind of Data, which type is choosen by the user. User save his work, and in the xml save file i want to write what type of variable he used, so when i have to open saves my program allocates the right template of Data example:

C++:

template <class T>
class Data{
private:
T variable;
...
};

XML:

<header>
  <type>int</type>
</header>

so here when i load the save file I want to have a Data<int> allocated...


Solution

  • You need to create factories, and a manager that 'maps' the value name (in string form) to one of the factories. Like this:

    class AbstractData {}
    
    template <class T>
    class Data : public AbstractData {
    private:
        T variable;
        ...
    };
    
    class FactoryManager
    {
        ...
        typedef std::function< AbstractData* () > Factory;   
    
        void registerFactory( const QString& name, const Factory& factory )
        {
            //  Check to see one is not already registered before adding.
            map_.insert( name, factory );
        }
    
        AbstractData* createData( const QString& name )
        {
            //  Check factory exists first.
            return map_[name]->createData();
        }
    
    private:
        QHash< QString, Factory > map_;
    }
    
    ...
    FactoryManager manager;
    manager.registerFactory( "int", [](){ return new Data< int >; } );
    ...
    Data< int >* data = manager.createData( "int" );