C++ 从XMLQt4.8c++;

C++ 从XMLQt4.8c++;,c++,xml,qt,load,xmlreader,C++,Xml,Qt,Load,Xmlreader,我做了这个程序,你有一些数据,类型由用户选择。 用户保存他的工作,在xml保存文件中,我想写下他使用的变量类型, 因此,当我必须打开保存时,我的程序会分配正确的数据模板 例如: C++: 模板 类数据{ 私人: T变量; ... }; XML: int 因此,在这里,当我加载保存文件时,我希望分配一个数据…您需要创建工厂,以及一个将值名称(以字符串形式)映射到其中一个工厂的管理器。像这样: class AbstractData {} template <class T> cl

我做了这个程序,你有一些数据,类型由用户选择。 用户保存他的工作,在xml保存文件中,我想写下他使用的变量类型, 因此,当我必须打开保存时,我的程序会分配正确的数据模板 例如:

C++:

模板
类数据{
私人:
T变量;
...
};
XML:


int

因此,在这里,当我加载保存文件时,我希望分配一个
数据…

您需要创建工厂,以及一个将值名称(以字符串形式)映射到其中一个工厂的管理器。像这样:

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" );
类抽象数据{}
模板
类数据:公共抽象数据{
私人:
T变量;
...
};
班级工厂经理
{
...
typedef std::function工厂;
无效注册表工厂(常量字符串和名称、常量工厂和工厂)
{
//在添加之前,请检查一个是否尚未注册。
地图插入(名称、工厂);
}
AbstractData*createData(常量QString和名称)
{
//首先检查工厂是否存在。
返回映射[name]->createData();
}
私人:
QHashmap;
}
...
工厂经理;
registerFactory(“int”,[](){返回新数据;});
...
Data*Data=manager.createData(“int”);
<header>
  <type>int</type>
</header>
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" );